/ Hex Artifact Content
Login

Artifact 116deec8f08c188fdddd2a78576b4889f25f873db1be34168c1d98bbed1695ef:


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 3b 0a 20 20 61 73 73 65  skipNext;.  asse
7240: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
7250: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
7260: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7270: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
7280: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
7290: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
72a0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
72b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
72c0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
72d0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
72e0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
72f0: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
7300: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
7310: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
7320: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
7330: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
7340: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
7350: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
7360: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
7370: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
7380: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
7390: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
73a0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
73b0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
73c0: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
73d0: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
73e0: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
73f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
7400: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
7410: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7420: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
7430: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
7440: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
7450: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
7470: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
7480: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
7490: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
74a0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
74b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
74c0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
74d0: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
74e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
74f0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
7500: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7510: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
7520: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
7530: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
7540: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
7550: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
7560: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
7570: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
7580: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
7590: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
75a0: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
75b0: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
75c0: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
75d0: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
75e0: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
75f0: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
7600: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
7610: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
7620: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
7630: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
7640: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
7650: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
7660: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
7670: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
7680: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7690: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
76a0: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
76b0: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
76c0: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
76d0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
76e0: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
76f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7700: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7710: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7720: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
7730: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
7740: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
7750: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
7760: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
7770: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
7780: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
7790: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
77a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
77b0: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
77c0: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
77d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
77e0: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
77f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7800: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
7810: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
7820: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
7830: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
7840: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
7850: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
7860: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
7870: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
7880: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
7890: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
78a0: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
78b0: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
78c0: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
78d0: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
78e0: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
78f0: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
7900: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
7910: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
7920: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
7930: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
7940: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
7950: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
7960: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
7970: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
7980: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
7990: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
79a0: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
79b0: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
79c0: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
79d0: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
79e0: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
79f0: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7a00: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7a10: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7a20: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
7a30: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
7a40: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
7a50: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
7a60: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
7a70: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
7a80: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
7a90: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
7aa0: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7ab0: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7ac0: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7ad0: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7ae0: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7af0: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7b00: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7b10: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7b20: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7b30: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7b40: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7b50: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
7b60: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
7b70: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
7b80: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7b90: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
7ba0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7bb0: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7bd0: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7be0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7bf0: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7c00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7c10: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7c20: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7c30: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7c40: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
7c50: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
7c60: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7c70: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
7c80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
7c90: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7ca0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7cb0: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7cc0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
7cd0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7ce0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7cf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7d00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7d10: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7d20: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7d30: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7d40: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7d50: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7d60: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7d70: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7d80: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7d90: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7da0: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7db0: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
7dc0: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
7dd0: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
7de0: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
7df0: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7e10: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7e20: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7e30: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7e40: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7e50: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7e60: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7e70: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7e80: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7e90: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7ea0: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7eb0: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
7ec0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
7ed0: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
7ee0: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
7ef0: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7f00: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7f10: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7f20: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7f30: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7f40: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7f50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7f60: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7f70: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7f80: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7f90: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7fa0: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7fb0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
7fc0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7fd0: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
7fe0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
7ff0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
8000: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
8010: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
8020: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
8030: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
8040: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
8050: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
8060: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
8070: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
8080: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
8090: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
80a0: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
80b0: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
80c0: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
80d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
80e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
80f0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8100: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8110: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8120: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8130: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
8140: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
8150: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
8160: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
8170: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
8180: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
8190: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
81a0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
81b0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
81c0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
81d0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
81e0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
81f0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8200: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8210: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8220: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
8230: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8240: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8250: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
8260: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
8270: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
8280: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
8290: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
82a0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
82b0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
82c0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
82d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
82e0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
82f0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8300: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8310: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8320: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
8330: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
8340: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
8350: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
8360: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
8370: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8380: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
8390: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
83a0: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
83b0: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
83c0: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
83d0: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
83e0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
83f0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8400: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8410: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8420: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
8430: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
8440: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
8450: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
8460: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
8470: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
8480: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8490: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
84a0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
84b0: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
84c0: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
84d0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
84e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
84f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8500: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8510: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8520: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
8530: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
8540: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
8550: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
8560: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
8570: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
8580: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
8590: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
85a0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
85b0: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
85c0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
85d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
85e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
85f0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8600: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8610: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8620: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
8630: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
8640: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
8650: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8660: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
8670: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
8680: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28 63  n;.  }.  if( ((c
8690: 68 61 72 2a 29 73 71 6c 69 74 65 33 50 61 67 65  har*)sqlite3Page
86a0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
86b0: 65 29 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  e))[0]!=0 ){.   
86c0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 62 79   /* The first by
86d0: 74 65 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  te of the extra 
86e0: 64 61 74 61 20 69 73 20 74 68 65 20 4d 65 6d 50  data is the MemP
86f0: 61 67 65 2e 69 73 49 6e 69 74 20 62 79 74 65 2e  age.isInit byte.
8700: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 61 74 20  .    ** If that 
8710: 62 79 74 65 20 69 73 20 73 65 74 2c 20 69 74 20  byte is set, it 
8720: 6d 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20  means this page 
8730: 69 73 20 61 6c 73 6f 20 62 65 69 6e 67 20 75 73  is also being us
8740: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 62  ed.    ** as a b
8750: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
8760: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8770: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8780: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8790: 69 74 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  it;.  }.  offset
87a0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
87b0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
87c0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
87d0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
87e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
87f0: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
8800: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
8810: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8820: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
8830: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
8840: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
8850: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
8860: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
8870: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
8880: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
8890: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
88a0: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
88b0: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
88c0: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
88d0: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
88e0: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
88f0: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
8900: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8910: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8920: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
8930: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8940: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
8950: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
8960: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
8970: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
8980: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
8990: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
89a0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
89b0: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
89c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
89d0: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
89e0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
89f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8a00: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8a10: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8a20: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
8a30: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
8a40: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
8a50: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
8a60: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
8a70: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
8a80: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8a90: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8aa0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8ab0: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8ac0: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8ad0: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8ae0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8af0: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8b00: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8b10: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8b20: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8b30: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8b40: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8b50: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8b60: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8b70: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8b80: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8b90: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8ba0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8bb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8bc0: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8bd0: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8be0: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8bf0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8c00: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8c10: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8c20: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8c30: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8c40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8c50: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8c60: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8c70: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8c80: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c90: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8ca0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8cb0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8cc0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8cd0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8ce0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8cf0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8d00: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8d10: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8d20: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8d30: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8d40: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8d50: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8d60: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8d70: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8d80: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8d90: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8da0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8db0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8dc0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8dd0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8de0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8df0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8e00: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8e10: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8e30: 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61  RUPT_PGNO(iPtrma
8e40: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
8e50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8e60: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8e70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8e80: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8e90: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8ea0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8eb0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8ec0: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8ed0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8ee0: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
8ef0: 20 7a 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   z, rc).#endif..
8f00: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8f10: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8f20: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8f30: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8f40: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8f50: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8f60: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8f70: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8f80: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8f90: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8fa0: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8fb0: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8fc0: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8fd0: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8fe0: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8ff0: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
9000: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
9010: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
9020: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
9030: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
9040: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
9050: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
9060: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
9070: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
9080: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9090: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
90a0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
90b0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
90c0: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
90d0: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
90e0: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
90f0: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
9100: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
9110: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9120: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
9130: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
9140: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
9150: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
9160: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
9170: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
9180: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9190: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
91a0: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
91b0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
91c0: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
91d0: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
91e0: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
91f0: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
9200: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
9210: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
9220: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
9230: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
9240: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
9250: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
9260: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
9270: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
9280: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9290: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
92a0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
92b0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
92c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
92d0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
92e0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
92f0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9300: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9310: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9320: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
9330: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
9340: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
9350: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9360: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9370: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9380: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9390: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
93a0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
93b0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
93c0: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
93d0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
93e0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
93f0: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
9400: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
9410: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
9420: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
9430: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
9440: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
9450: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9460: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9470: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9480: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9490: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
94a0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
94b0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
94c0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
94d0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
94e0: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
94f0: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
9500: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
9510: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
9520: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
9530: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
9540: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9550: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9560: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9570: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9580: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9590: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
95a0: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
95b0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
95c0: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
95d0: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
95e0: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
95f0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9600: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9610: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9620: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
9630: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
9640: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
9650: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9660: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9670: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9680: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9690: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
96a0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
96b0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
96c0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
96d0: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
96e0: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
96f0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
9700: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
9710: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
9720: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
9730: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9740: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9750: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9760: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
9770: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
9780: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9790: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
97a0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
97b0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
97c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
97d0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
97e0: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
97f0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
9800: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
9810: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
9820: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
9830: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
9840: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
9850: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9860: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
9870: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
9880: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9890: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
98a0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
98b0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
98c0: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
98d0: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
98e0: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
98f0: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
9900: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
9910: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
9920: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
9930: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
9940: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
9950: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9960: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9970: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9980: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9990: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
99a0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
99b0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
99c0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
99d0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
99e0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
99f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9a00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9a30: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a50: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9a60: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9a70: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9a80: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9a90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9aa0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9ab0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9ac0: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9ad0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9ae0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9af0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9b00: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9b10: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9b20: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9b30: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9b40: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9b50: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9b60: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9b70: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9b80: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9ba0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9bb0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9bc0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9bd0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9be0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9bf0: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9c10: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9c20: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9c30: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9c50: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9c60: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9c70: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9c90: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9ca0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9cb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9cc0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9cd0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9ce0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9cf0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9d00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9d10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9d20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9d30: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9d40: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9d50: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9d60: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9d70: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9d80: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9d90: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9da0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9db0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9dc0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9dd0: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9de0: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9df0: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9e00: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9e10: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9e20: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9e30: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9e40: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9e50: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9e60: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9e70: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9e80: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9e90: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9ea0: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9eb0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9ec0: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9ed0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9ee0: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9ef0: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9f00: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9f10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9f20: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9f30: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9f40: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9f50: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9f60: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9f70: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9f80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9f90: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9fa0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9fb0: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9fc0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9fd0: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9fe0: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9ff0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a000: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
a010: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
a020: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
a030: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
a040: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
a050: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
a060: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a070: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a080: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
a090: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
a0a0: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
a0b0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
a0c0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
a0d0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
a0e0: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
a0f0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
a100: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a110: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a120: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a130: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a140: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
a150: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a160: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
a170: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
a180: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
a190: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
a1a0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
a1b0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
a1c0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
a1d0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
a1e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
a1f0: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
a200: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a210: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
a220: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
a230: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
a240: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a250: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
a260: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a270: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a280: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a290: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a2a0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a2b0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a2c0: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
a2d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a2e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a2f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a300: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a310: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a320: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a330: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a340: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a350: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a360: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a370: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a380: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a390: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a3a0: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a3b0: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a3c0: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a3d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a3e0: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a3f0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a410: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a420: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a430: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a440: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a450: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a460: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a470: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a480: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a490: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a4a0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a4b0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a4c0: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a4d0: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a4e0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a4f0: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a500: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a510: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a520: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a530: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a540: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a550: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a560: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a570: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a580: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a590: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a5a0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a5b0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a5c0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a5d0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a5e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a5f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a600: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a610: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a620: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a630: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a640: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a650: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a660: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a670: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a680: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a690: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a6a0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a6b0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a6c0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a6d0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a6e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a6f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a700: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a710: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a720: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a730: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a750: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a760: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a770: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a780: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a790: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a7a0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a7b0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a7c0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a7d0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a7e0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a800: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a810: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a820: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a830: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a840: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a850: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a860: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a870: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a880: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a890: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a8a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a8b0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a8c0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a8d0: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a8e0: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a8f0: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a900: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a910: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a920: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a930: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a940: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a950: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a960: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a970: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a980: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a990: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a9a0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a9b0: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a9c0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a9d0: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a9e0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a9f0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
aa00: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
aa10: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
aa20: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
aa40: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
aa50: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
aa60: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
aa70: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
aa80: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
aa90: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
aaa0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
aab0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aac0: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
aad0: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
aae0: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
aaf0: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
ab20: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
ab30: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
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 2f 2a 20               /* 
ab60: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
ab70: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
ab80: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
ab90: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
aba0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
abb0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
abc0: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
abd0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
abe0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
abf0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
ac00: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
ac10: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
ac20: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
ac30: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
ac40: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
ac50: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
ac60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
ac70: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
ac80: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
ac90: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
aca0: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
acb0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
acc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
acd0: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
ace0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
acf0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
ad00: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
ad10: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
ad20: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
ad30: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
ad40: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
ad50: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
ad60: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
ad70: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
ad80: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
ad90: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ada0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
adb0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
adc0: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
add0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
ade0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
adf0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
ae00: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
ae10: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
ae20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
ae30: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
ae40: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
ae50: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
ae60: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ae70: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
ae80: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ae90: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
aea0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
aeb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
aec0: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
aed0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
aee0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
aef0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
af00: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
af10: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
af20: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
af30: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
af40: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
af50: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
af60: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
af70: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
af80: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
af90: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
afa0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
afb0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
afc0: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
afd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
afe0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
aff0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
b000: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
b010: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
b020: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
b030: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
b040: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
b050: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
b060: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
b070: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
b080: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
b090: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b0a0: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
b0b0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
b0c0: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
b0d0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
b0e0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
b0f0: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
b100: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
b110: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
b120: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
b130: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
b140: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
b150: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
b160: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
b170: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
b180: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
b190: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
b1a0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b1b0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b1c0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b1d0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b1e0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b1f0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b200: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b210: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b220: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b230: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b240: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b250: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b260: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b270: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b280: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b290: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b2a0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b2b0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b2c0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b2d0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b2e0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b2f0: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b300: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
b310: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
b320: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b330: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b340: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b350: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b360: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b370: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b380: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b390: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b3a0: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b3b0: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b3c0: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b3d0: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b3e0: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b3f0: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b400: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b410: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b420: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b430: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b440: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b450: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b460: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b470: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b480: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b490: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b4a0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b4b0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b4c0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b4d0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b4e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b4f0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
b500: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 73  he cell pCell is
b510: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
b520: 6f 66 20 70 61 67 65 20 70 53 72 63 20 62 75 74  of page pSrc but
b530: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
b540: 20 62 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 70   be part.** of p
b550: 50 61 67 65 2e 20 20 28 70 53 72 63 20 61 6e 64  Page.  (pSrc and
b560: 20 70 50 61 67 65 72 20 61 72 65 20 6f 66 74 65   pPager are ofte
b570: 6e 20 74 68 65 20 73 61 6d 65 2e 29 20 20 49 66  n the same.)  If
b580: 20 70 43 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   pCell contains 
b590: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
b5a0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b5b0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
b5c0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
b5d0: 65 72 2d 6d 61 70 20 66 6f 72 0a 2a 2a 20 74 68  er-map for.** th
b5e0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
b5f0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 61 6c  that will be val
b600: 69 64 20 61 66 74 65 72 20 70 43 65 6c 6c 20 68  id after pCell h
b610: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 74 6f  as been moved to
b620: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
b630: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
b640: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
b650: 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
b660: 2a 70 53 72 63 2c 20 75 38 20 2a 70 43 65 6c 6c  *pSrc, u8 *pCell
b670: 2c 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65  ,int *pRC){.  Ce
b680: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
b690: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
b6a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
b6b0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
b6c0: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b6d0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
b6e0: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
b6f0: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
b700: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
b710: 66 6c 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  fl;.    if( SQLI
b720: 54 45 5f 57 49 54 48 49 4e 28 70 53 72 63 2d 3e  TE_WITHIN(pSrc->
b730: 61 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c  aDataEnd, pCell,
b740: 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63   pCell+info.nLoc
b750: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  al) ){.      tes
b760: 74 63 61 73 65 28 20 70 53 72 63 21 3d 70 50 61  tcase( pSrc!=pPa
b770: 67 65 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 43  ge );.      *pRC
b780: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b790: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b7a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b7b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b7c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b7d0: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b7e0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b7f0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b800: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b810: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b820: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b830: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b840: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b850: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b860: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b870: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b880: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b890: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b8a0: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b8b0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b8c0: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b8d0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b8e0: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b8f0: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b900: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b910: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b920: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b930: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b940: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b950: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b960: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b970: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b980: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b990: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b9a0: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b9b0: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b9c0: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b9d0: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b9e0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b9f0: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
ba00: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
ba10: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
ba20: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
ba30: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ba40: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
ba50: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
ba60: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
ba70: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
ba80: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
baa0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
bab0: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bad0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
bae0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
baf0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
bb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
bb10: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
bb20: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
bb30: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bb50: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
bb60: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
bb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bb80: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
bb90: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
bba0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
bbb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bbc0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
bbd0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bbe0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
bc10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bc20: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
bc30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bc40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc50: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
bc60: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
bc70: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
bc80: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
bc90: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
bca0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bcb0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bcc0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bcd0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bce0: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
bcf0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bd00: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bd10: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bd20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bd30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bd40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bd50: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bd60: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bd70: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bd80: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bd90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bda0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bdb0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bdc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bdd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bde0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bdf0: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
be00: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
be10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
be20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
be30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
be40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
be50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
be60: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
be70: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
be80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
be90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bea0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
beb0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bec0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
bed0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
bee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
bef0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
bf00: 61 5b 68 64 72 2b 33 5d 29 20 7c 7c 20 43 4f 52  a[hdr+3]) || COR
bf10: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 69 43 65  RUPT_DB );.  iCe
bf20: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bf30: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
bf40: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bf50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bf60: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
bf70: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
bf80: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
bf90: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
bfa0: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
bfb0: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
bfc0: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
bfd0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
bfe0: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
bff0: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
c000: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
c010: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
c020: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
c030: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
c040: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
c050: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
c060: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
c070: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
c080: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
c090: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
c0a0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
c0b0: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
c0c0: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
c0d0: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
c0e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c0f0: 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  +1]);..    /* If
c100: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 66 72 65   the initial fre
c110: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 77 65  eblock offset we
c120: 72 65 20 6f 75 74 20 6f 66 20 62 6f 75 6e 64 73  re out of bounds
c130: 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76  , that would hav
c140: 65 0a 20 20 20 20 2a 2a 20 62 65 65 6e 20 64 65  e.    ** been de
c150: 74 65 63 74 65 64 20 62 79 20 62 74 72 65 65 43  tected by btreeC
c160: 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65 28  omputeFreeSpace(
c170: 29 20 77 68 65 6e 20 69 74 20 77 61 73 20 63 6f  ) when it was co
c180: 6d 70 75 74 69 6e 67 20 74 68 65 0a 20 20 20 20  mputing the.    
c190: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ** number of fre
c1a0: 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  e bytes on the p
c1b0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
c1c0: 72 74 28 20 69 46 72 65 65 3c 3d 75 73 61 62 6c  rt( iFree<=usabl
c1d0: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69  eSize-4 );.    i
c1e0: 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20 20  f( iFree ){.    
c1f0: 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20 67    int iFree2 = g
c200: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c210: 72 65 65 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  ree]);.      if(
c220: 20 69 46 72 65 65 32 3e 75 73 61 62 6c 65 53 69   iFree2>usableSi
c230: 7a 65 2d 34 20 29 20 72 65 74 75 72 6e 20 53 51  ze-4 ) return SQ
c240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c250: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c260: 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c  if( 0==iFree2 ||
c270: 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d   (data[iFree2]==
c280: 30 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32  0 && data[iFree2
c290: 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  +1]==0) ){.     
c2a0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64     u8 *pEnd = &d
c2b0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
c2c0: 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20   nCell*2];.     
c2d0: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20     u8 *pAddr;.  
c2e0: 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20        int sz2 = 
c2f0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  0;.        int s
c300: 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  z = get2byte(&da
c310: 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20  ta[iFree+2]);.  
c320: 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20        int top = 
c330: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
c340: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20  dr+5]);.        
c350: 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65 20 29  if( top>=iFree )
c360: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
c370: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c380: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
c390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3a0: 20 69 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20   if( iFree2 ){. 
c3b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
c3c0: 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29 20 72  ee+sz>iFree2 ) r
c3d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c3e0: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  ;.          sz2 
c400: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c410: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
c420: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
c430: 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c 65 53 69  2+sz2 > usableSi
c440: 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ze ) return SQLI
c450: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c460: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
c470: 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
c480: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26  iFree+sz+sz2], &
c490: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20  data[iFree+sz], 
c4a0: 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a  iFree2-(iFree+sz
c4b0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  ));.          sz
c4c0: 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20   += sz2;.       
c4d0: 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20   }.        cbrk 
c4e0: 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20  = top+sz;.      
c4f0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28    assert( cbrk+(
c500: 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73  iFree-top) <= us
c510: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
c520: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
c530: 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74  a[cbrk], &data[t
c540: 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b  op], iFree-top);
c550: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64  .        for(pAd
c560: 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  dr=&data[cellOff
c570: 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64  set]; pAddr<pEnd
c580: 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20  ; pAddr+=2){.   
c590: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
c5a0: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
c5b0: 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46         if( pc<iF
c5c0: 72 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28  ree ){ put2byte(
c5d0: 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d  pAddr, pc+sz); }
c5e0: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
c5f0: 69 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b  if( pc<iFree2 ){
c600: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c610: 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20   pc+sz2); }.    
c620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
c630: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  to defragment_ou
c640: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
c650: 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75  .  }..  cbrk = u
c660: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
c670: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
c680: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
c690: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
c6a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
c6b0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
c6c0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
c6d0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
c6e0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
c6f0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
c700: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
c710: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c720: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
c730: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c740: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
c750: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
c760: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
c770: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
c780: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
c790: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
c7a0: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
c7b0: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
c7c0: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
c7d0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c7e0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c800: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c810: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
c820: 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46  sert( pc>=iCellF
c830: 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c  irst && pc<=iCel
c840: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a  lLast );.    siz
c850: 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  e = pPage->xCell
c860: 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63  Size(pPage, &src
c870: 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20  [pc]);.    cbrk 
c880: 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  -= size;.    if(
c890: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
c8a0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
c8b0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c8c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c8d0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c8e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
c8f0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
c900: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
c910: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
c920: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c930: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
c940: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
c950: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
c960: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c970: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
c980: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
c990: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
c9a0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
c9b0: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
c9c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
c9d0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
c9e0: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
c9f0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
ca00: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
ca10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ca20: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
ca30: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
ca40: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
ca50: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
ca60: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
ca70: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
ca80: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
ca90: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  ize);.  }.  data
caa0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64  [hdr+7] = 0;.. d
cab0: 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20  efragment_out:. 
cac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cad0: 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66  nFree>=0 );.  if
cae0: 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62  ( data[hdr+7]+cb
caf0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
cb00: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
cb10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cb20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
cb30: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
cb40: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
cb50: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
cb60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
cb70: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
cb80: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
cb90: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
cba0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
cbb0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
cbc0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
cbd0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cbe0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
cbf0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cc00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
cc10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cc20: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
cc30: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
cc40: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
cc50: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
cc60: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
cc70: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
cc80: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
cc90: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
cca0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
ccb0: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
ccc0: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
ccd0: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
cce0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
ccf0: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
cd00: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
cd10: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
cd20: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
cd30: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
cd40: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
cd50: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
cd60: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
cd70: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
cd80: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
cd90: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
cda0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
cdb0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
cdc0: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
cdd0: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
cde0: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
cdf0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
ce00: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
ce10: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
ce20: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
ce30: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
ce40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
ce50: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
ce60: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
ce70: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
ce80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
ce90: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
cea0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
ceb0: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
cec0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
ced0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70    /* Offset to p
cee0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
cef0: 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
cf00: 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20   = pPg->aData;  
cf10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
cf20: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
cf30: 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31   iAddr = hdr + 1
cf40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cf50: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
cf60: 73 73 20 6f 66 20 70 74 72 20 74 6f 20 70 63 20  ss of ptr to pc 
cf70: 2a 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65  */.  int pc = ge
cf80: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69 41  t2byte(&aData[iA
cf90: 64 64 72 5d 29 3b 20 20 20 20 20 20 20 20 20 20  ddr]);          
cfa0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
cfb0: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69  free slot */.  i
cfc0: 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  nt x;           
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63            /* Exc
cff0: 65 73 73 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ess size of the 
d000: 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  slot */.  int ma
d010: 78 50 43 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  xPC = pPg->pBt->
d020: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e 42 79  usableSize - nBy
d030: 74 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64 64 72  te;  /* Max addr
d040: 65 73 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65  ess for a usable
d050: 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 73   slot */.  int s
d060: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
d090: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
d0a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
d0b0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
d0c0: 3c 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 2f  <=maxPC ){.    /
d0d0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d0e0: 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65  -22710-53328 The
d0f0: 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74   third and fourt
d100: 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a  h bytes of each.
d110: 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b      ** freeblock
d120: 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69   form a big-endi
d130: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
d140: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
d150: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20  the freeblock.  
d160: 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69    ** in bytes, i
d170: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62  ncluding the 4-b
d180: 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  yte header. */. 
d190: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
d1a0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29  te(&aData[pc+2])
d1b0: 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73  ;.    if( (x = s
d1c0: 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20  ize - nByte)>=0 
d1d0: 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
d1e0: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
d1f0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
d200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 34  );.      if( x<4
d210: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
d220: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
d230: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
d240: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
d250: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
d260: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
d270: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
d280: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
d290: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
d2a0: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
d2b0: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
d2c0: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
d2d0: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
d2e0: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
d2f0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
d300: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
d310: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
d320: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
d330: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d340: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
d350: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
d360: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
d370: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
d380: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
d390: 7d 65 6c 73 65 20 69 66 28 20 78 2b 70 63 20 3e  }else if( x+pc >
d3a0: 20 6d 61 78 50 43 20 29 7b 0a 20 20 20 20 20 20   maxPC ){.      
d3b0: 20 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74 20 65    /* This slot e
d3c0: 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65 20 65  xtends off the e
d3d0: 6e 64 20 6f 66 20 74 68 65 20 75 73 61 62 6c 65  nd of the usable
d3e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 67   part of the pag
d3f0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 52  e */.        *pR
d400: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
d410: 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20  PT_PAGE(pPg);.  
d420: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
d430: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d440: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
d450: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
d460: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
d470: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
d480: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a  count.        **
d490: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
d4a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
d4b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
d4c0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
d4d0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
d4e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d4f0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
d500: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
d510: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
d520: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
d530: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  &aData[pc]);.   
d540: 20 69 66 28 20 70 63 3c 3d 69 41 64 64 72 2b 73   if( pc<=iAddr+s
d550: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
d560: 20 70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pc ){.        /
d570: 2a 20 54 68 65 20 6e 65 78 74 20 73 6c 6f 74 20  * The next slot 
d580: 69 6e 20 74 68 65 20 63 68 61 69 6e 20 69 73 20  in the chain is 
d590: 6e 6f 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  not past the end
d5a0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
d5b0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20  slot */.        
d5c0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
d5d0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b  RRUPT_PAGE(pPg);
d5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
d5f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
d600: 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61 78 50   }.  if( pc>maxP
d610: 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20 20 20  C+nByte-4 ){.   
d620: 20 2f 2a 20 54 68 65 20 66 72 65 65 20 73 6c 6f   /* The free slo
d630: 74 20 63 68 61 69 6e 20 65 78 74 65 6e 64 73 20  t chain extends 
d640: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
d650: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 2a  he page */.    *
d660: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d670: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d690: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
d6a0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
d6b0: 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68   space from with
d6c0: 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70 61  in the B-Tree pa
d6d0: 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  ge passed.** as 
d6e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
d6f0: 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  nt. Write into *
d700: 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20 69  pIdx the index i
d710: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
d720: 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  [].** of the fir
d730: 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63  st byte of alloc
d740: 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74 75  ated space. Retu
d750: 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  rn either SQLITE
d760: 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72  _OK or.** an err
d770: 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79  or code (usually
d780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29   SQLITE_CORRUPT)
d790: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
d7a0: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
d7b0: 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66 66  at there is suff
d7c0: 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20  icient space to 
d7d0: 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f  make the.** allo
d7e0: 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f  cation.  This ro
d7f0: 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64  utine might need
d800: 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69   to defragment i
d810: 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67  n order to bring
d820: 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63  .** all the spac
d830: 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65  e together, howe
d840: 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ver.  This routi
d850: 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73  ne will avoid us
d860: 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ing.** the first
d870: 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74 20   two bytes past 
d880: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
d890: 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65 73   area since pres
d8a0: 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61  umably this.** a
d8b0: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69  llocation is bei
d8c0: 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72  ng made in order
d8d0: 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77   to insert a new
d8e0: 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c   cell, so we wil
d8f0: 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70  l.** also end up
d900: 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63   needing a new c
d910: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
d920: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
d930: 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  ateSpace(MemPage
d940: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79   *pPage, int nBy
d950: 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a  te, int *pIdx){.
d960: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
d970: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d980: 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  et;    /* Local 
d990: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
d9a0: 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75  hdrOffset */.  u
d9b0: 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
d9c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
d9d0: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
d9e0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  he of pPage->aDa
d9f0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ta */.  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 20 20 20 20 20 20 2f 2a 20               /* 
da20: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65  First byte of ce
da30: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
da40: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
da50: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
da60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
da70: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
da80: 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20   */.  int gap;  
da90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
daa0: 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77 65  yte of gap betwe
dab0: 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73  en cell pointers
dac0: 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   and cell conten
dad0: 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  t */.  .  assert
dae0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
daf0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
db00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
db10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
db20: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
db30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
db40: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
db50: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
db60: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
db70: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
db80: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
db90: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
dba0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
dbb0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
dbc0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
dbd0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
dbe0: 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74  (int)(pPage->pBt
dbf0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20  ->usableSize-8) 
dc00: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
dc10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
dc20: 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a  == hdr + 12 - 4*
dc30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
dc40: 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65   gap = pPage->ce
dc50: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
dc60: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
dc70: 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20  ert( gap<=65536 
dc80: 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
dc90: 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33  -OF: R-29356-023
dca0: 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62 61  91 If the databa
dcb0: 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36 2d  se uses a 65536-
dcc0: 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20  byte page size. 
dcd0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65   ** and the rese
dce0: 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a 65  rved space is ze
dcf0: 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76 61  ro (the usual va
dd00: 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65 64  lue for reserved
dd10: 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65   space).  ** the
dd20: 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  n the cell conte
dd30: 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20  nt offset of an 
dd40: 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74 73  empty page wants
dd50: 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20   to be 65536..  
dd60: 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74  ** However, that
dd70: 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20   integer is too 
dd80: 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72  large to be stor
dd90: 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75  ed in a 2-byte u
dda0: 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74  nsigned.  ** int
ddb0: 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65  eger, so a value
ddc0: 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69 6e   of 0 is used in
ddd0: 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20   its place. */. 
dde0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
ddf0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
de00: 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69   assert( top<=(i
de10: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
de20: 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20  sableSize ); /* 
de30: 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e  Prevent by getAn
de40: 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20  dInitPage() */. 
de50: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a   if( gap>top ){.
de60: 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26      if( top==0 &
de70: 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  & pPage->pBt->us
de80: 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20  ableSize==65536 
de90: 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36  ){.      top = 6
dea0: 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  5536;.    }else{
deb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
dec0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ded0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
dee0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
def0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
df00: 63 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61  ce between gap a
df10: 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d  nd top for one m
df20: 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ore cell pointer
df30: 2c 0a 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68  ,.  ** and if th
df40: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
df50: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
df60: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
df70: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
df80: 6f 72 20 61 20 73 6c 6f 74 20 62 69 67 20 65 6e  or a slot big en
df90: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
dfa0: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a  the request..  *
dfb0: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
dfc0: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
dfd0: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
dfe0: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
dff0: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20  ( gap==top );.  
e000: 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d  if( (data[hdr+2]
e010: 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29   || data[hdr+1])
e020: 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29   && gap+2<=top )
e030: 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65  {.    u8 *pSpace
e040: 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
e050: 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72  pPage, nByte, &r
e060: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  c);.    if( pSpa
e070: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
e080: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
e090: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
e0a0: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
e0b0: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
e0c0: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
e0d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e0e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
e0f0: 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  se if( rc ){.   
e100: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e110: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e120: 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20  e request could 
e130: 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64  not be fulfilled
e140: 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73   using a freelis
e150: 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20  t slot.  Check. 
e160: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65   ** to see if de
e170: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73  fragmentation is
e180: 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
e190: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
e1a0: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
e1b0: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
e1c0: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73  te>top ){.    as
e1d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
e1e0: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
e1f0: 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
e200: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
e210: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  0 );.    rc = de
e220: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
e230: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
e240: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
e250: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
e260: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
e270: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
e280: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
e290: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
e2a0: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
e2b0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
e2c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
e2d0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
e2e0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
e2f0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
e300: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
e310: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
e320: 2e 20 20 54 68 65 20 62 74 72 65 65 43 6f 6d 70  .  The btreeComp
e330: 75 74 65 46 72 65 65 53 70 61 63 65 28 29 20 63  uteFreeSpace() c
e340: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
e350: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
e360: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
e370: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
e380: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
e390: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
e3a0: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
e3b0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
e3c0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
e3d0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
e3e0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
e3f0: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
e400: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
e410: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
e420: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
e430: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
e440: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
e450: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
e460: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
e470: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
e480: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
e490: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e4a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
e4b0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
e4c0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
e4d0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
e4e0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
e4f0: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
e500: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
e510: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
e520: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
e530: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
e540: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
e550: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
e560: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
e570: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  esced..**.** Eve
e580: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
e590: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
e5a0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
e5b0: 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65  ComputeFreeSpace
e5c0: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
e5d0: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
e5e0: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
e5f0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
e600: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
e610: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
e620: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
e630: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
e640: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
e650: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
e660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
e670: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
e680: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
e690: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
e6a0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
e6b0: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
e6c0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
e6d0: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
e6e0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
e6f0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
e700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
e710: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
e720: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  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 20 20 20 20 20 20 2f 2a 20               /* 
e750: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
e760: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
e770: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
e780: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
e790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e7a0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
e7b0: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
e7c0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
e7f0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
e800: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
e810: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
e840: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
e850: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
e860: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
e870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
e880: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
e890: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78  iSize */.  u16 x
e8a0: 3b 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 20 20 20 20 20                  
e8c0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
e8d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
e8e0: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
e8f0: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
e900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e910: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
e920: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
e930: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
e940: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
e950: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
e960: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
e970: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e980: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
e990: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e9a0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e9b0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e9c0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
e9d0: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
e9e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
e9f0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
ea00: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
ea10: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
ea20: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
ea30: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
ea40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ea50: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ea60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
ea70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
ea80: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
ea90: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
eaa0: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
eab0: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61  ert( iStart<=pPa
eac0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ead0: 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54  ize-4 );..  /* T
eae0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
eaf0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
eb00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
eb10: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
eb20: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
eb30: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
eb40: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
eb50: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
eb60: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
eb70: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
eb80: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
eb90: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
eba0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
ebb0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
ebc0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
ebd0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
ebe0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ebf0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
ec00: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
ec10: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
ec20: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
ec30: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
ec40: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
ec50: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
ec60: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
ec70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ec80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ec90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eca0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ecb0: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
ecc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ecd0: 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e  iFreeBlk>pPage->
ece0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
ecf0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
ed00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ed10: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ed20: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ed30: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
ed40: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
ed50: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
ed60: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
ed70: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
ed80: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
ed90: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
eda0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
edb0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
edc0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
edd0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
ede0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
edf0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
ee00: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
ee10: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
ee20: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
ee30: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
ee40: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
ee50: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
ee60: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
ee70: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
ee80: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
ee90: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
eea0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
eeb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
eec0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64  age);.      iEnd
eed0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
eee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
eef0: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
ef00: 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
ef10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ef20: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
ef30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ef40: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
ef50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ef60: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
ef70: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
ef80: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
ef90: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
efa0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
efb0: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
efc0: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
efd0: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
efe0: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
eff0: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
f000: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
f010: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
f020: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
f030: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
f040: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
f050: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
f060: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
f070: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
f080: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
f090: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
f0a0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
f0b0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f0c0: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
f0d0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
f0e0: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
f0f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f100: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
f110: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  ge);.        nFr
f120: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
f130: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
f140: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
f150: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
f160: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
f170: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
f180: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
f190: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
f1a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
f1b0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74  (pPage);.    dat
f1c0: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
f1d0: 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74  g;.  }.  x = get
f1e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f1f0: 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72  5]);.  if( iStar
f200: 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t<=x ){.    /* T
f210: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
f220: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
f230: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
f240: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
f250: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
f260: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
f270: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
f280: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
f290: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
f2a0: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
f2b0: 20 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20     if( iStart<x 
f2c0: 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  || iPtr!=hdr+1 )
f2d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f2e0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
f2f0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
f300: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
f310: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
f320: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
f330: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
f340: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
f350: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
f360: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
f370: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
f380: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
f390: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d  r], iStart);.  }
f3a0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
f3b0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
f3c0: 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
f3d0: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
f3e0: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
f3f0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
f400: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
f410: 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
f420: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
f430: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
f440: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
f450: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
f460: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
f470: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
f480: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
f490: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
f4a0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
f4b0: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
f4c0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
f4d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f4e0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
f4f0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
f500: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
f510: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
f520: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
f530: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
f540: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
f550: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
f560: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
f570: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
f580: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
f590: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
f5a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
f5b0: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
f5c0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
f5d0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
f5e0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
f5f0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
f600: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
f610: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
f620: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
f630: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
f640: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f650: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
f660: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
f670: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
f680: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
f690: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
f6a0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
f6b0: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
f6c0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
f6d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
f6e0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
f6f0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
f700: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
f710: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f720: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f730: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
f740: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
f750: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
f760: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
f770: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
f780: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
f790: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
f7a0: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
f7b0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
f7c0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
f7d0: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
f7e0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
f7f0: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
f800: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
f810: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
f820: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f830: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
f840: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
f850: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
f860: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
f870: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
f880: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
f890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
f8a0: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
f8b0: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
f8c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f8d0: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
f8e0: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
f8f0: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
f900: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f910: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
f920: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f930: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f940: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
f950: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
f960: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f970: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
f980: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f990: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f9a0: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
f9b0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f9c0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f9d0: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
f9e0: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
f9f0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
fa00: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
fa10: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
fa20: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
fa30: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
fa40: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
fa50: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
fa60: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
fa70: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
fa80: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
fa90: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
faa0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
fab0: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
fac0: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
fad0: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
fae0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
faf0: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
fb00: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
fb10: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
fb20: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
fb30: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
fb40: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
fb50: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
fb60: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
fb70: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
fb80: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
fb90: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
fba0: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
fbb0: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
fbc0: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
fbd0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
fbe0: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
fbf0: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
fc00: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
fc10: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
fc20: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
fc30: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
fc40: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
fc50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
fc60: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
fc70: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
fc80: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
fc90: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
fca0: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
fcb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
fcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
fcd0: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
fce0: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
fcf0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
fd00: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
fd10: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
fd20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fd30: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
fd40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
fd50: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
fd60: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
fd70: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
fd80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fd90: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  ** Compute the a
fda0: 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 73 70 61  mount of freespa
fdb0: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ce on the page. 
fdc0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
fdd0: 20 66 69 6c 6c 0a 2a 2a 20 69 6e 20 74 68 65 20   fill.** in the 
fde0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 66 69 65  pPage->nFree fie
fdf0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ld..*/.static in
fe00: 74 20 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72  t btreeComputeFr
fe10: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
fe20: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70  *pPage){.  int p
fe30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
fe40: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
fe50: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
fe60: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
fe70: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
fe80: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
fe90: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
fea0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
feb0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
fec0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
fed0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
fee0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
fef0: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
ff00: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
ff10: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
ff20: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ff30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ff40: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ff50: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
ff60: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
ff70: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ff80: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
ff90: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
ffa0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
ffb0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
ffc0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ffd0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ffe0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
fff0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
10000 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
10010 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
10020 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
10030 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
10040 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
10050 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
10060 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10070 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
10080 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
10090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
100a0 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
100b0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
100c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
100d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
100e0 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
100f0 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
10100 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
10110 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
10120 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
10130 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
10140 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
10150 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
10160 49 6e 69 74 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Init==1 );.  ass
10170 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
10180 65 3c 30 20 29 3b 0a 0a 20 20 75 73 61 62 6c 65  e<0 );..  usable
10190 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
101a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
101b0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
101c0 72 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20  rOffset;.  data 
101d0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
101e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
101f0 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
10200 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
10210 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
10220 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
10230 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
10240 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
10250 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
10260 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
10270 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
10280 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
10290 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
102a0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
102b0 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 43 65  a[hdr+5]);.  iCe
102c0 6c 6c 46 69 72 73 74 20 3d 20 68 64 72 20 2b 20  llFirst = hdr + 
102d0 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  8 + pPage->child
102e0 50 74 72 53 69 7a 65 20 2b 20 32 2a 70 50 61 67  PtrSize + 2*pPag
102f0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c  e->nCell;.  iCel
10300 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
10310 7a 65 20 2d 20 34 3b 0a 0a 20 20 2f 2a 20 43 6f  ze - 4;..  /* Co
10320 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
10330 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
10340 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44  e page.  ** EVID
10350 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38  ENCE-OF: R-23588
10360 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62  -34450 The two-b
10370 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
10380 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68  ffset 1 gives th
10390 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20  e.  ** start of 
103a0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
103b0 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  ock on the page,
103c0 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74   or is zero if t
103d0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
103e0 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a   freeblocks. */.
103f0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
10400 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
10410 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
10420 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
10430 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
10440 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
10450 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20   space */.  if( 
10460 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  pc>0 ){.    u32 
10470 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
10480 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
10490 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t ){.      /* EV
104a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
104b0 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
104c0 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
104d0 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
104e0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79  l.      ** alway
104f0 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  s be at least on
10500 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68  e cell before th
10510 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
10520 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
10530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10540 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10550 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  ge); .    }.    
10560 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
10570 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61    if( pc>iCellLa
10580 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
10590 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
105a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
105b0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
105c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
105d0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
105e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
105f0 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
10600 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
10610 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
10620 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
10630 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
10640 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
10650 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69   if( next<=pc+si
10660 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  ze+3 ) break;.  
10670 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
10680 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78     }.    if( nex
10690 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  t>0 ){.      /* 
106a0 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e  Freeblock not in
106b0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
106c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
106d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
106e0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
106f0 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69   }.    if( pc+si
10700 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ze>(unsigned int
10710 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  )usableSize ){. 
10720 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65       /* Last fre
10730 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70  eblock extends p
10740 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a  ast page end */.
10750 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10760 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10770 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10780 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73   }..  /* At this
10790 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
107a0 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
107b0 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
107c0 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
107d0 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
107e0 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
107f0 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
10800 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a  bytes within.  *
10810 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  * the cell-conte
10820 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73  nt area. If this
10830 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
10840 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65   the usable-size
10850 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  .  ** of the pag
10860 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
10870 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
10880 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
10890 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20  lso.  ** serves 
108a0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
108b0 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
108c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
108d0 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ll-content.  ** 
108e0 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
108f0 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
10900 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
10910 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  the page..  */. 
10920 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
10930 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  eSize ){.    ret
10940 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10950 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10960 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
10970 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
10980 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
10990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
109a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
109b0 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
109c0 79 20 63 68 65 63 6b 20 61 66 74 65 72 20 62 74  y check after bt
109d0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 69 66  reeInitPage() if
109e0 0a 2a 2a 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f  .** PRAGMA cell_
109f0 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a 2a  size_check=ON .*
10a00 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
10a10 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
10a20 65 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28  eeCellSizeCheck(
10a30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10a40 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
10a50 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
10a60 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
10a70 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
10a80 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
10a90 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
10aa0 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
10ab0 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
10ac0 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  set */.  int i; 
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
10ae0 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
10af0 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
10b00 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20   */.  int sz;   
10b10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10b20 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
10b30 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
10b40 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
10b50 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
10b60 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
10b70 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
10b80 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
10b90 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
10ba0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ata */.  int usa
10bb0 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 4d  bleSize;    /* M
10bc0 61 78 69 6d 75 6d 20 75 73 61 62 6c 65 20 73 70  aximum usable sp
10bd0 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
10be0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
10bf0 73 65 74 3b 20 20 20 20 2f 2a 20 53 74 61 72 74  set;    /* Start
10c00 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
10c10 20 61 72 65 61 20 2a 2f 0a 0a 20 20 69 43 65 6c   area */..  iCel
10c20 6c 46 69 72 73 74 20 3d 20 70 50 61 67 65 2d 3e  lFirst = pPage->
10c30 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
10c40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 75  Page->nCell;.  u
10c50 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
10c60 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
10c70 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ze;.  iCellLast 
10c80 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
10c90 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
10ca0 2d 3e 61 44 61 74 61 3b 0a 20 20 63 65 6c 6c 4f  ->aData;.  cellO
10cb0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
10cc0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
10cd0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
10ce0 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 66  iCellLast--;.  f
10cf0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
10d00 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
10d10 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
10d20 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
10d30 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
10d40 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
10d50 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
10d60 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
10d70 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
10d80 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
10d90 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
10da0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
10db0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10dc0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10dd0 20 20 20 20 7d 0a 20 20 20 20 73 7a 20 3d 20 70      }.    sz = p
10de0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
10df0 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
10e00 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
10e10 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
10e20 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 63  ze );.    if( pc
10e30 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
10e40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10e50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10e60 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
10e70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10e80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10e90 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10ea0 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
10eb0 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
10ec0 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
10ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10ee0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
10ef0 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
10f00 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
10f10 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
10f20 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
10f30 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
10f40 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
10f50 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
10f60 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
10f70 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
10f80 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
10f90 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
10fa0 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
10fb0 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
10fc0 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
10fd0 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
10fe0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10ff0 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
11000 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
11010 29 7b 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  ){.  u8 *data;  
11020 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
11030 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
11040 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
11050 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
11060 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
11070 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 61 73  ructure */..  as
11080 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
11090 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
110a0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
110b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
110c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
110d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
110e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
110f0 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
11100 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11110 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
11120 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
11130 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
11140 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11150 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11160 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
11170 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
11180 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
11190 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
111a0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
111b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30  pPage->isInit==0
111c0 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   );..  pBt = pPa
111d0 67 65 2d 3e 70 42 74 3b 0a 20 20 64 61 74 61 20  ge->pBt;.  data 
111e0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b  = pPage->aData +
111f0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
11200 74 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  t;.  /* EVIDENCE
11210 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
11220 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
11230 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
11240 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a   indicating.  **
11250 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
11260 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20   type. */.  if( 
11270 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
11280 65 2c 20 64 61 74 61 5b 30 5d 29 20 29 7b 0a 20  e, data[0]) ){. 
11290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
112a0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
112b0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
112c0 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
112d0 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
112e0 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
112f0 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
11300 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
11310 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
11320 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
11330 6f 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ow = 0;.  pPage-
11340 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50  >cellOffset = pP
11350 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b  age->hdrOffset +
11360 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
11370 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50 61 67  dPtrSize;.  pPag
11380 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 64 61  e->aCellIdx = da
11390 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ta + pPage->chil
113a0 64 50 74 72 53 69 7a 65 20 2b 20 38 3b 0a 20 20  dPtrSize + 8;.  
113b0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
113c0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b  = pPage->aData +
113d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
113e0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
113f0 4f 66 73 74 20 3d 20 70 50 61 67 65 2d 3e 61 44  Ofst = pPage->aD
11400 61 74 61 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ata + pPage->chi
11410 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 2f 2a 20  ldPtrSize;.  /* 
11420 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
11430 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
11440 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
11450 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
11460 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
11470 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
11480 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
11490 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
114a0 62 79 74 65 28 26 64 61 74 61 5b 33 5d 29 3b 0a  byte(&data[3]);.
114b0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
114c0 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
114d0 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  ){.    /* To man
114e0 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
114f0 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
11500 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
11510 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75  rupt */.    retu
11520 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11530 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
11540 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
11550 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
11560 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f  CELL(pBt) );.  /
11570 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
11580 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20  -24089-57979 If 
11590 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  a page contains 
115a0 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20  no cells (which 
115b0 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73  is only.  ** pos
115c0 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74  sible for a root
115d0 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65   page of a table
115e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
115f0 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65  o rows) then the
11600 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20  .  ** offset to 
11610 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
11620 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
11630 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
11640 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79  inus the.  ** by
11650 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
11660 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65  space. */.  asse
11670 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
11680 3e 30 0a 20 20 20 20 20 20 20 7c 7c 20 67 65 74  >0.       || get
11690 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
116a0 74 61 5b 35 5d 29 3d 3d 70 42 74 2d 3e 75 73 61  ta[5])==pBt->usa
116b0 62 6c 65 53 69 7a 65 0a 20 20 20 20 20 20 20 7c  bleSize.       |
116c0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
116d0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
116e0 20 2d 31 3b 20 20 2f 2a 20 49 6e 64 69 63 61 74   -1;  /* Indicat
116f0 65 20 74 68 61 74 20 74 68 69 73 20 76 61 6c 75  e that this valu
11700 65 20 69 73 20 79 65 74 20 75 6e 63 6f 6d 70 75  e is yet uncompu
11710 74 65 64 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e  ted */.  pPage->
11720 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66  isInit = 1;.  if
11730 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
11740 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
11750 7a 65 43 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  zeCk ){.    retu
11760 72 6e 20 62 74 72 65 65 43 65 6c 6c 53 69 7a 65  rn btreeCellSize
11770 43 68 65 63 6b 28 70 50 61 67 65 29 3b 0a 20 20  Check(pPage);.  
11780 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11790 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
117a0 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
117b0 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
117c0 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
117d0 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
117e0 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
117f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
11800 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
11810 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
11820 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
11830 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
11840 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
11850 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
11860 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
11870 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
11880 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
11890 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
118a0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
118b0 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
118c0 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
118d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
118e0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
118f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11900 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
11910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11920 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11930 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11940 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
11950 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11960 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
11970 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
11980 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11990 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
119a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
119b0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
119c0 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
119d0 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  URE ){.    memse
119e0 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
119f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11a00 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64   - hdr);.  }.  d
11a10 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
11a20 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
11a30 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26  = hdr + ((flags&
11a40 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31  PTF_LEAF)==0 ? 1
11a50 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74  2 : 8);.  memset
11a60 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
11a70 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
11a80 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
11a90 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
11aa0 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
11ab0 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
11ac0 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ee = (u16)(pBt->
11ad0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72  usableSize - fir
11ae0 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  st);.  decodeFla
11af0 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
11b00 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
11b10 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
11b20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
11b30 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73   = &data[pBt->us
11b40 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
11b50 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
11b60 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70  data[first];.  p
11b70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
11b80 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
11b90 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
11ba0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
11bb0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
11bc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
11bd0 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
11be0 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
11bf0 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
11c00 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
11c10 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
11c20 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
11c30 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
11c40 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
11c50 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
11c60 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
11c70 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
11c80 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
11c90 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
11ca0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
11cb0 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
11cc0 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
11cd0 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
11ce0 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
11cf0 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
11d00 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
11d10 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
11d20 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
11d30 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50  ;.  if( pgno!=pP
11d40 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  age->pgno ){.   
11d50 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
11d60 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11d70 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
11d80 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
11d90 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20   = pDbPage;.    
11da0 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
11db0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e  ;.    pPage->pgn
11dc0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50  o = pgno;.    pP
11dd0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
11de0 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a   pgno==1 ? 100 :
11df0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
11e00 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d  ( pPage->aData==
11e10 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11e20 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
11e30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
11e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
11e50 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
11e60 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
11e70 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
11e80 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
11e90 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
11ea0 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61  f needed.  See a
11eb0 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75  lso: btreeGetUnu
11ec0 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  sedPage()..**.**
11ed0 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45   If the PAGER_GE
11ee0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67  T_NOCONTENT flag
11ef0 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
11f00 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
11f10 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74   care.** about t
11f20 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
11f30 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
11f40 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
11f50 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
11f60 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
11f70 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
11f80 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
11f90 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
11fa0 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
11fb0 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
11fc0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
11fd0 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
11fe0 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
11ff0 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
12000 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
12010 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
12020 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
12030 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
12040 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
12050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
12060 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
12070 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
12080 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
12090 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
120b0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
120c0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
120d0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
120e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
120f0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
12100 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
12110 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
12120 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
12130 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
12140 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
12150 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12160 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
12170 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
12180 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
12190 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
121a0 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
121b0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
121c0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
121d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
121e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
121f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12200 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
12210 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
12220 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
12230 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
12240 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
12250 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
12260 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
12270 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
12280 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12290 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
122a0 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
122b0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
122c0 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
122d0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
122e0 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
122f0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12300 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
12310 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
12320 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
12330 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
12340 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
12350 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
12360 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
12370 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
12380 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
12390 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
123a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
123b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
123c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
123d0 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
123e0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
123f0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
12400 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
12410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
12420 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12430 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12440 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
12450 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
12460 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
12470 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
12480 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
12490 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
124a0 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
124b0 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
124c0 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
124d0 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
124e0 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
124f0 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
12500 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
12510 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
12520 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
12530 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
12540 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
12550 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
12560 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
12570 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30  Page)&0x80000000
12580 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
12590 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
125a0 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
125b0 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
125c0 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
125d0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a  initialize it..*
125e0 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20  *.** If pCur!=0 
125f0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  then the page is
12600 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61   being fetched a
12610 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65  s part of a move
12620 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c  ToChild().** cal
12630 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  l.  Do additiona
12640 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
12650 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e  g on the page in
12660 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41   this case..** A
12670 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20  nd if the fetch 
12680 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74  fails, this rout
12690 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65  ine must decreme
126a0 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a  nt pCur->iPage..
126b0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69  **.** The page i
126c0 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61  s fetched as rea
126d0 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70  d-write unless p
126e0 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Cur is not NULL 
126f0 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64  and is.** a read
12700 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a  -only cursor..**
12710 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
12720 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70  occurs, then *pp
12730 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Page is undefine
12740 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
12750 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
12760 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
12770 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
12780 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
12790 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
127a0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
127b0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
127c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
127d0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
127e0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12800 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12810 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
12820 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12830 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
12840 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
12850 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
12860 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
12870 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
12880 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
12890 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61  o receive the pa
128a0 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ge, or NULL */. 
128b0 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20   int bReadOnly  
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128d0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
128e0 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  ead-only page */
128f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
12900 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
12910 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12920 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
12930 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
12940 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
12950 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d  | ppPage==&pCur-
12960 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
12970 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62  rt( pCur==0 || b
12980 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e  ReadOnly==pCur->
12990 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b  curPagerFlags );
129a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
129b0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  =0 || pCur->iPag
129c0 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  e>0 );..  if( pg
129d0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
129e0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63  t(pBt) ){.    rc
129f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12a00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
12a10 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
12a20 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20 72 63  error1;.  }.  rc
12a30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
12a40 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
12a50 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
12a60 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
12a70 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
12a80 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
12a90 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31  dInitPage_error1
12aa0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
12ab0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
12ac0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
12ad0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
12ae0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
12af0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
12b00 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12b10 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12b20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
12b30 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
12b40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12b60 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
12b70 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32  dInitPage_error2
12b80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
12b90 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
12ba0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
12bb0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12bc0 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
12bd0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12be0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
12bf0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
12c00 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
12c10 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
12c20 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
12c30 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
12c40 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
12c50 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
12c60 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
12c70 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
12c80 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
12c90 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
12ca0 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
12cb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12cc0 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a  UPT_PGNO(pgno);.
12cd0 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12ce0 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3b 0a  nitPage_error2;.
12cf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12d00 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
12d10 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32 3a 0a  nitPage_error2:.
12d20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12d30 70 50 61 67 65 29 3b 0a 67 65 74 41 6e 64 49 6e  pPage);.getAndIn
12d40 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3a 0a 20  itPage_error1:. 
12d50 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20   if( pCur ){.   
12d60 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
12d70 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
12d80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
12d90 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d  Cur->iPage];.  }
12da0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
12db0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
12dc0 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
12dd0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
12de0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12df0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
12e00 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
12e10 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
12e20 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
12e30 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
12e40 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
12e50 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61  **.** Page1 is a
12e60 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e   special case an
12e70 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73  d must be releas
12e80 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65  ed using release
12e90 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74  PageOne()..*/.st
12ea0 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12eb0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d  ePageNotNull(Mem
12ec0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12ed0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
12ee0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
12ef0 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
12f00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12f10 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20  >pDbPage!=0 );. 
12f20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12f30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
12f40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
12f50 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
12f60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12f70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
12f80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
12f90 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
12fa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12fb0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
12fc0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
12fd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12fe0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
12ff0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d  age->pDbPage);.}
13000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
13010 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
13020 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
13030 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50  pPage ) releaseP
13040 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  ageNotNull(pPage
13050 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
13060 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
13070 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
13080 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13090 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
130a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
130b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
130c0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
130d0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
130e0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
130f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
13100 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
13110 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
13120 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
13130 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13140 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
13150 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
13160 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
13170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13180 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
13190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
131a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50  lite3PagerUnrefP
131b0 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44  ageOne(pPage->pD
131c0 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
131d0 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70   Get an unused p
131e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
131f0 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
13200 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77  btreeGetPage() w
13210 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
13220 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20  :.**.**   *  If 
13230 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
13240 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73  ady in use for s
13250 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
13260 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  e, immediately.*
13270 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69  *      release i
13280 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  t and return an 
13290 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65  SQLITE_CURRUPT e
132a0 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61  rror..**   *  Ma
132b0 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e  ke sure the isIn
132c0 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  it flag is clear
132d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
132e0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
132f0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
13300 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
13310 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
13320 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
13330 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
13340 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
13350 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
13360 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
13370 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
13380 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
13390 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
133a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
133b0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
133c0 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
133d0 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
133e0 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  t rc = btreeGetP
133f0 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
13400 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
13410 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13420 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
13430 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
13440 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
13450 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
13460 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
13470 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
13480 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
13490 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
134a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
134b0 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
134c0 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
134d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
134e0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
134f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13500 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
13510 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
13520 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
13530 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
13540 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
13550 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
13560 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
13570 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
13580 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
13590 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
135a0 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
135b0 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
135c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
135d0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
135e0 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
135f0 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
13600 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
13610 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
13620 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
13630 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
13640 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
13650 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
13660 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
13670 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
13680 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
13690 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
136a0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
136b0 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
136c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
136d0 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
136e0 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
136f0 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
13700 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13710 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
13720 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
13730 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
13740 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
13750 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
13760 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
13770 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
13780 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
13790 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
137a0 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
137b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
137c0 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
137d0 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
137e0 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
137f0 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
13800 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
13810 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
13820 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
13830 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
13840 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
13850 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
13860 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
13870 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
13880 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
13890 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
138a0 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
138b0 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
138c0 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
138d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
138e0 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
138f0 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
13900 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
13910 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
13920 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
13930 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
13940 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
13950 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
13960 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
13970 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
13980 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
13990 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
139a0 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
139b0 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
139c0 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
139d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
139e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
139f0 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
13a00 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
13a10 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
13a20 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
13a30 79 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20  yHandler,.      
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 20 73 71 6c 69              sqli
13a60 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
13a70 2d 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f  ->pPager));.}../
13a80 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
13a90 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
13aa0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
13ab0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
13ac0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
13ad0 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
13ae0 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
13af0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13b00 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
13b10 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
13b20 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
13b30 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
13b40 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
13b50 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
13b60 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
13b70 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
13b80 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
13b90 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
13ba0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
13bb0 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
13bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13bd0 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
13be0 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
13bf0 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
13c00 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
13c10 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
13c20 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
13c30 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
13c40 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
13c50 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
13c60 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
13c70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
13c80 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
13c90 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
13ca0 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
13cb0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
13cc0 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
13cd0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
13ce0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
13cf0 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
13d00 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13d10 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
13d20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
13d30 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
13d40 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
13d50 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
13d60 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
13d70 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
13d80 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
13d90 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
13da0 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
13db0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
13dc0 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
13dd0 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
13de0 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
13df0 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
13e00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13e10 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
13e20 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
13e30 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
13e40 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
13e50 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13e60 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
13e70 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
13e80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
13e90 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
13ea0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
13eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
13ec0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
13ed0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
13ee0 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
13ef0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
13f00 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
13f10 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
13f20 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13f40 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
13f50 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
13f60 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
13f70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
13f80 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
13f90 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
13fa0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13fc0 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
13fd0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
13fe0 0a 20 20 42 74 72 65 65 20 2a 70 3b 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 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
14010 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
14020 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
14030 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
14040 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
14050 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
14060 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
14070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14080 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
14090 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
140a0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
140b0 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
140d0 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
140e0 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
140f0 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
14100 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
14110 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
14120 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
14130 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
14140 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
14150 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
14160 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
14170 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
14180 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
14190 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
141a0 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
141b0 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
141c0 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
141d0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
141e0 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
141f0 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
14200 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
14210 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
14220 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
14230 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
14240 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
14250 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
14260 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
14270 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
14280 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
14290 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
142c0 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
142d0 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
14300 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
14310 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
14320 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
14330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
14340 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
14350 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14360 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
14370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
14380 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
14390 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
143a0 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
143b0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
143c0 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
143d0 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
143e0 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
143f0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
14400 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
14410 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
14420 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
14430 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
14440 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
14450 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
14460 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
14470 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
14480 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
14490 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
144a0 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
144b0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
144c0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
144d0 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
144e0 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
144f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
14500 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
14510 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
14520 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
14530 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
14540 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
14550 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
14560 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
14570 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
14580 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
14590 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
145a0 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
145b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
145c0 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  PT;.  }.  p->inT
145d0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
145e0 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
145f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14600 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14610 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
14620 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
14630 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
14640 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
14650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14660 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14670 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14680 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
14690 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
146a0 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
146b0 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
146c0 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
146d0 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
146e0 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
146f0 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
14700 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
14710 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
14720 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
14730 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
14740 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
14750 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
14760 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
14770 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
14780 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69  ){.      int nFi
14790 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
147a0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
147b0 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  me)+1;.      int
147c0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
147d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
147e0 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
147f0 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
14800 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d   sqlite3Malloc(M
14810 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  AX(nFullPathname
14820 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  ,nFilename));.  
14830 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
14840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
14850 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a  mutexShared; )..
14860 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
14870 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
14880 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
14890 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
148a0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
148b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
148c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
148d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
148e0 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
148f0 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
14900 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
14910 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
14920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14930 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14940 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
14950 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
14960 0a 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 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d      nFullPathnam
14990 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
149a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
149b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  c ){.          s
149c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
149d0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
149e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
149f0 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
14a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14a10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
14a20 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
14a30 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  AFE.      mutexO
14a40 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
14a50 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14a60 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
14a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14a90 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
14aa0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
14ab0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14ac0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14ad0 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
14ae0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14af0 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
14b00 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
14b10 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
14b20 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14b30 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14b40 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
14b50 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
14b60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
14b70 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
14b80 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
14b90 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
14ba0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
14bb0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
14bc0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
14bd0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
14be0 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
14bf0 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
14c00 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
14c10 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
14c20 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
14c30 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
14c40 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
14c50 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
14c60 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
14c70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
14c80 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
14c90 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
14ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
14cb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14cc0 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14ce0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14cf0 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14d10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
14d20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
14d30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14d40 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
14d50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14d60 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
14d80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14d90 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
14da0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
14db0 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
14dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14de0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14df0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14e00 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
14e10 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14e20 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
14e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
14e40 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
14e50 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
14e60 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
14e70 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
14e80 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
14e90 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
14ea0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
14eb0 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
14ec0 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
14ed0 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
14ee0 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
14ef0 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
14f00 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
14f10 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
14f20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
14f30 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
14f40 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
14f50 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
14f60 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
14f70 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
14f80 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
14f90 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
14fa0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
14fb0 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
14fc0 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
14fd0 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
14fe0 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
14ff0 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
15000 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
15010 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
15020 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
15030 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
15040 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
15050 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
15060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
15070 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
15080 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
15090 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
150a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
150b0 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
150c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
150d0 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
150e0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
150f0 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
15100 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
15110 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
15120 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
15130 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
15140 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15150 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15160 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
15170 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
15180 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15190 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
151a0 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
151b0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67     sizeof(MemPag
151e0 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  e), flags, vfsFl
151f0 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
15200 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
15210 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15220 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15230 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
15240 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
15250 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
15260 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
15270 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
15280 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
15290 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
152a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
152b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
152c0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
152d0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
152e0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
152f0 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
15300 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
15310 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
15320 33 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e  3PagerSetBusyHan
15330 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
15340 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
15350 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
15360 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
15370 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
15380 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
15390 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
153a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
153b0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
153c0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
153d0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
153e0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
153f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
15400 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
15410 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15420 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
15430 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65  DELETE;.#elif de
15440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53  fined(SQLITE_FAS
15450 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  T_SECURE_DELETE)
15460 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
15470 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52  gs |= BTS_OVERWR
15480 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ITE;.#endif.    
15490 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
154a0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
154b0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
154c0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
154d0 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
154e0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
154f0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
15500 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
15510 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
15520 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
15530 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
15540 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
15550 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
15560 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
15570 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
15580 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
15590 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
155a0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
155b0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
155c0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
155d0 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
155e0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
155f0 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
15600 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
15610 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
15620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15630 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
15640 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
15650 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
15660 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
15670 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
15680 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
15690 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
156a0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
156b0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
156c0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
156d0 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
156e0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
156f0 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
15700 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
15710 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
15720 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
15730 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
15740 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
15750 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
15760 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
15770 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
15780 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
15790 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
157a0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
157b0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
157c0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
157d0 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
157e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
157f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
15800 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
15810 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
15820 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
15830 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
15840 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
15850 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
15860 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
15870 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
15880 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
15890 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
158a0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
158b0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
158c0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
158d0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
158e0 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
158f0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
15900 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
15910 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
15920 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
15930 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
15940 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
15950 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
15960 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
15970 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
15980 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
15990 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
159a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
159b0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
159c0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
159d0 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
159e0 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
159f0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
15a00 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
15a10 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
15a20 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
15a30 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
15a40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
15a50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
15a60 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
15a70 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
15a80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
15a90 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15aa0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
15ab0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
15ac0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
15ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
15ae0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
15af0 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
15b00 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
15b10 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
15b20 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15b30 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15b40 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
15b50 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
15b60 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
15b70 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
15b80 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
15b90 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
15ba0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
15bb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
15bc0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69  >nRef = 1;.    i
15bd0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
15be0 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
15bf0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
15c00 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
15c10 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c   ).      MUTEX_L
15c20 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
15c30 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
15c40 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
15c50 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
15c60 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
15c70 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
15c80 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
15c90 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
15ca0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
15cb0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
15cc0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15cd0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
15ce0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
15cf0 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
15d00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15d10 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15d20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
15d30 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
15d60 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
15d70 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
15d80 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
15d90 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15da0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15db0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
15dc0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15dd0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15de0 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
15df0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15e00 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
15e10 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
15e20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
15e30 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
15e40 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
15e50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
15e60 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
15e70 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
15e80 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
15e90 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
15ea0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
15eb0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
15ec0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
15ed0 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
15ee0 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
15ef0 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
15f00 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
15f10 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
15f20 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
15f30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
15f40 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
15f50 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
15f60 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
15f70 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
15f80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
15f90 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
15fa0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
15fb0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
15fc0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
15fd0 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
15fe0 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
15ff0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
16000 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74  uptr)p->pBt<(upt
16010 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  r)pSib->pBt ){. 
16020 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
16030 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
16040 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
16050 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
16060 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
16070 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16080 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
16090 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74  b->pNext && (upt
160a0 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  r)pSib->pNext->p
160b0 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20  Bt<(uptr)p->pBt 
160c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
160d0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
160e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
160f0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
16100 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
16110 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
16120 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
16130 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
16140 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
16150 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
16160 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
16170 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
16180 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
16190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
161a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
161b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
161c0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
161d0 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
161e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
161f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
16200 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
16210 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
16220 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
16230 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  t->pPager, 0);. 
16240 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16250 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
16260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
16270 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
16280 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16290 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
162a0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ile;..    /* If 
162b0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
162c0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
162d0 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
162e0 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
162f0 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
16300 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
16310 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
16320 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
16330 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
16340 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
16350 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
16360 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
16370 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
16380 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
16390 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
163a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
163b0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
163c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
163d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
163e0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a  E_SIZE);.    }..
163f0 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69      pFile = sqli
16400 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
16410 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
16420 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
16430 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ds ){.      sqli
16440 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
16450 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
16460 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76  TE_FCNTL_PDB, (v
16470 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a  oid*)&pBt->db);.
16480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16490 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
164a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
164b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
164c0 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
164d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
164e0 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
164f0 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
16500 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
16510 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
16520 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65  ionCount(*ppBtre
16530 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  e)>0 );.  return
16540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
16550 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
16560 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
16570 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
16580 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
16590 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
165a0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
165b0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
165c0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
165d0 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
165e0 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
165f0 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
16600 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
16610 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
16620 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
16630 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
16640 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
16650 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
16660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16670 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
16680 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
16690 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
166a0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
166b0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
166c0 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
166d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
166e0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
166f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
16700 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
16710 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
16720 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
16730 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
16740 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
16750 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
16760 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
16770 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
16780 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
16790 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
167a0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
167b0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
167c0 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
167d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
167e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
167f0 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
16800 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16810 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
16820 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
16830 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
16840 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
16850 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
16860 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
16870 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
16880 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
16890 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
168a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
168b0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
168c0 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
168d0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
168e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
168f0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
16900 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
16910 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
16920 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
16930 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
16940 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
16950 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
16960 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
16970 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
16980 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
16990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
169a0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
169b0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
169c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
169d0 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
169e0 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
169f0 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
16a00 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
16a10 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
16a20 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
16a30 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
16a40 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16a50 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
16a60 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
16a70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
16a80 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
16a90 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
16aa0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
16ab0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
16ac0 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
16ad0 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
16ae0 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
16af0 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
16b00 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
16b10 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
16b20 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
16b30 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
16b40 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
16b50 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
16b60 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
16b70 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
16b80 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
16b90 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
16ba0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
16bb0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
16bc0 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
16bd0 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
16be0 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
16bf0 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
16c00 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
16c10 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
16c20 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
16c30 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
16c40 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
16c50 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
16c60 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
16c70 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
16c80 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
16c90 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
16ca0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
16cb0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
16cc0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
16cd0 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
16ce0 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
16cf0 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
16d00 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
16d10 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
16d20 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
16d30 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
16d40 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
16d50 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
16d60 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
16d70 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
16d80 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
16d90 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
16da0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
16db0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
16dc0 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
16dd0 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
16de0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
16df0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
16e00 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
16e10 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
16e20 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16e30 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
16e40 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
16e50 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
16e60 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
16e70 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
16e80 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
16e90 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
16ea0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
16eb0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
16ec0 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
16ed0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
16ee0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16ef0 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
16f00 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
16f10 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
16f20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
16f30 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
16f40 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
16f50 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
16f60 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
16f70 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
16f80 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
16f90 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
16fa0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
16fb0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
16fc0 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
16fd0 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
16fe0 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
16ff0 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
17000 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17010 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
17020 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
17030 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17040 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
17050 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
17060 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
17070 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
17080 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
17090 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
170a0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
170b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
170c0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
170d0 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
170e0 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
170f0 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
17100 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
17110 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
17120 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
17130 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
17140 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
17150 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
17160 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
17170 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
17180 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
17190 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
171a0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
171b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
171c0 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
171d0 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
171e0 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
171f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
17200 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
17210 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
17220 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
17230 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
17240 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
17250 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
17260 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
17270 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
17280 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
17290 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
172a0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
172b0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
172c0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
172d0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
172e0 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
172f0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
17300 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
17310 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
17320 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
17330 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
17340 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
17350 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
17360 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
17370 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
17380 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
17390 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
173a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
173b0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
173c0 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  , p->db);.    if
173d0 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
173e0 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
173f0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
17400 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
17410 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
17420 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
17430 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
17440 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
17450 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
17460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17470 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
17480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
17490 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
174a0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
174b0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
174c0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
174d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
174e0 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
174f0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
17500 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
17510 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
17520 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
17530 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
17540 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
17550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17560 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17570 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
17580 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17590 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
175a0 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
175b0 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
175c0 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
175d0 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
175e0 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
175f0 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
17600 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
17610 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
17620 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
17630 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
17640 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
17650 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
17660 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
17670 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
17680 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
17690 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
176a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
176b0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
176c0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
176d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
176e0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
176f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17700 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
17710 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
17720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17730 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17740 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
17750 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
17760 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17770 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17780 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17790 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
177a0 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
177b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
177c0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
177d0 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
177e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
177f0 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
17800 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
17810 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
17820 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
17830 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
17840 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
17850 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
17860 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
17870 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
17880 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
17890 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
178a0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
178b0 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
178c0 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
178d0 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
178e0 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
178f0 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
17900 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
17910 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
17920 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
17930 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
17940 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
17950 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
17960 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
17970 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
17980 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17990 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
179a0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
179b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
179c0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
179d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
179e0 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
179f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17a00 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
17a10 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
17a20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17a30 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17a40 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
17a50 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
17a60 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
17a70 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
17a80 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
17a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
17aa0 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
17ab0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
17ac0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17ad0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
17ae0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
17af0 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
17b00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17b10 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17b30 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17b40 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17b50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
17b60 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
17b70 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
17b80 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
17b90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17ba0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17bc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
17bd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
17be0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17bf0 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
17c00 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
17c10 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
17c20 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
17c30 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
17c40 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
17c50 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
17c60 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
17c70 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
17c80 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
17c90 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
17ca0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
17cb0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
17cc0 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
17cd0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17ce0 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
17cf0 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
17d00 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
17d10 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
17d20 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
17d30 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
17d40 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
17d50 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17d60 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
17d70 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
17d80 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
17d90 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
17da0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17db0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
17dc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17dd0 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
17de0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
17df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17e00 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
17e10 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
17e20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
17e30 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
17e40 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
17e50 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
17e60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17e70 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17e80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17e90 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17ea0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
17eb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
17ec0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
17ed0 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
17ee0 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
17ef0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17f00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17f10 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
17f20 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17f30 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
17f40 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
17f50 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
17f60 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
17f70 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
17f80 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
17f90 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
17fa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17fb0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
17fc0 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
17fd0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
17fe0 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
17ff0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
18000 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
18010 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
18020 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
18030 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
18040 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
18050 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
18060 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
18070 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
18080 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
18090 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
180a0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
180b0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
180c0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
180d0 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
180e0 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
180f0 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
18100 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
18110 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
18120 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
18130 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
18140 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
18150 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18160 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
18170 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
18180 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
18190 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
181a0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
181b0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
181c0 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
181d0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
181e0 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
181f0 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
18200 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
18210 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
18220 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
18230 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
18240 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
18250 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
18260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
18270 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
18280 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
18290 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
182a0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
182b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
182c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
182d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
182e0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
182f0 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
18300 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
18310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
18320 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
18330 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
18340 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
18350 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
18360 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
18370 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
18380 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
18390 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
183a0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
183b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
183c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
183d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
183e0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
183f0 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
18400 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
18410 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
18420 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
18430 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
18440 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
18450 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
18460 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
18470 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
18480 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
18490 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
184a0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
184b0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
184c0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
184d0 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
184e0 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
184f0 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
18500 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
18510 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
18520 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
18530 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
18540 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
18550 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
18560 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
18570 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
18580 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18590 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
185a0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
185b0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
185c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
185d0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
185e0 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
185f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18610 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
18620 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
18630 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
18640 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
18650 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
18660 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
18670 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
18680 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18690 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
186a0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
186b0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
186c0 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
186d0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
186e0 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
186f0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
18700 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
18710 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
18720 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
18730 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
18740 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
18750 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
18760 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
18770 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
18780 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
18790 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
187a0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
187b0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
187c0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
187d0 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
187e0 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
187f0 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
18800 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
18810 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
18820 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
18830 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
18840 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
18850 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
18860 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
18870 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
18880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18890 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
188a0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
188b0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
188c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
188d0 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
188e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
188f0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
18900 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
18910 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
18920 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
18930 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18940 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
18950 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
18960 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
18970 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
18980 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
18990 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
189a0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
189b0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
189c0 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
189d0 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
189e0 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
189f0 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
18a00 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
18a10 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
18a20 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
18a30 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
18a40 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
18a50 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
18a60 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
18a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18a80 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
18a90 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
18aa0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
18ab0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18ac0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
18ad0 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
18ae0 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
18af0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18b00 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
18b10 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
18b20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
18b30 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
18b40 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
18b50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18b60 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
18b70 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
18b80 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
18b90 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
18ba0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
18bb0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
18bc0 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
18bd0 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
18be0 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
18bf0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
18c00 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
18c10 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
18c20 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
18c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
18c40 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
18c50 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
18c60 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
18c70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18c80 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
18c90 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
18ca0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
18cb0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
18cc0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
18ce0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
18cf0 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
18d00 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
18d10 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  ETE and BTS_OVER
18d20 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a  WRITE flags:.**.
18d30 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30  **    newFlag==0
18d40 20 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f         Both BTS_
18d50 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e  SECURE_DELETE an
18d60 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
18d70 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20  are cleared.**  
18d80 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20    newFlag==1    
18d90 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45     BTS_SECURE_DE
18da0 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53  LETE set and BTS
18db0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c  _OVERWRITE is cl
18dc0 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46  eared.**    newF
18dd0 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53  lag==2       BTS
18de0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63  _SECURE_DELETE c
18df0 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f  leared and BTS_O
18e00 56 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a  VERWRITE is set.
18e10 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28  **    newFlag==(
18e20 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65  -1)    No change
18e30 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  s.**.** This rou
18e40 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71  tine acts as a q
18e50 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20  uery if newFlag 
18e60 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
18e70 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53  o.**.** With BTS
18e80 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20  _OVERWRITE set, 
18e90 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
18ea0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  is overwritten b
18eb0 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20  y zeros, but.** 
18ec0 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
18ed0 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74  ges are not writ
18ee0 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
18ef0 64 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20  database.  Thus 
18f00 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74  in-page.** delet
18f10 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c  ed content is cl
18f20 65 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c  eared, but freel
18f30 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  ist deleted cont
18f40 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ent is not..**.*
18f50 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52  * With BTS_SECUR
18f60 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74  E_DELETE, operat
18f70 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f  ion is like BTS_
18f80 4f 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74  OVERWRITE with t
18f90 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74  he addition.** t
18fa0 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61  hat freelist lea
18fb0 66 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  f pages are writ
18fc0 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
18fd0 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72  e database, incr
18fe0 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d  easing.** the am
18ff0 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f  ount of disk I/O
19000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19010 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
19020 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
19030 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
19040 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
19050 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
19060 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19070 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
19080 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53  OVERWRITE==BTS_S
19090 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29  ECURE_DELETE*2 )
190a0 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
190b0 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54  FAST_SECURE==(BT
190c0 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f  S_OVERWRITE|BTS_
190d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29  SECURE_DELETE) )
190e0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
190f0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
19100 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
19110 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a  TS_FAST_SECURE;.
19120 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
19130 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
19140 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61  RE_DELETE*newFla
19150 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d  g;.  }.  b = (p-
19160 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
19170 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
19180 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  )/BTS_SECURE_DEL
19190 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ETE;.  sqlite3Bt
191a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
191b0 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn b;.}../*.*
191c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
191d0 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
191e0 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
191f0 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
19200 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
19210 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
19220 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
19230 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
19240 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
19250 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
19260 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
19270 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
19280 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
19290 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
192a0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
192b0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
192c0 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
192d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
192e0 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
192f0 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
19300 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
19310 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19320 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
19330 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
19340 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
19350 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19370 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
19380 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
19390 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
193a0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
193b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
193c0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
193d0 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
193e0 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
193f0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
19400 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
19410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
19420 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
19430 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
19440 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
19450 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
19460 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19470 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19480 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
19490 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
194a0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
194b0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
194c0 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
194d0 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
194e0 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
194f0 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
19500 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19510 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
19520 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
19530 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19540 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
19550 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
19560 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
19570 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
19580 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19590 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
195a0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
195b0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
195c0 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
195d0 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
195e0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
195f0 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
19600 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
19610 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
19620 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
19640 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ndif.}../*.** If
19650 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f   the user has no
19660 74 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  t set the safety
19670 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20  -level for this 
19680 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
19690 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52  ion.** using "PR
196a0 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
196b0 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61  ", and if the sa
196c0 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f  fety-level is no
196d0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74  t already.** set
196e0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
196f0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
19700 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63  ction as the sec
19710 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a  ond parameter,.*
19720 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a  * set it so..*/.
19730 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
19740 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d  LT_SYNCHRONOUS!=
19750 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
19760 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c  AL_SYNCHRONOUS \
19770 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64  .    && !defined
19780 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
19790 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
197a0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
197b0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
197c0 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  u8 safety_level)
197d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
197e0 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66  .  Db *pDb;.  if
197f0 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d  ( (db=pBt->db)!=
19800 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44  0 && (pDb=db->aD
19810 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  b)!=0 ){.    whi
19820 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  le( pDb->pBt==0 
19830 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74  || pDb->pBt->pBt
19840 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20  !=pBt ){ pDb++; 
19850 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62  }.    if( pDb->b
19860 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20  SyncSet==0 .    
19870 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f   && pDb->safety_
19880 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65  level!=safety_le
19890 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62  vel .     && pDb
198a0 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20  !=&db->aDb[1] . 
198b0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d     ){.      pDb-
198c0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
198d0 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20  safety_level;.  
198e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
198f0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
19900 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
19910 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
19920 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  l | (db->flags &
19930 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
19940 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  K));.    }.  }.}
19950 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
19960 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19970 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65  ag(pBt,safety_le
19980 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  vel).#endif../* 
19990 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
199a0 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
199b0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
199c0 53 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  Shared*);.../*.*
199d0 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
199e0 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
199f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19a00 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
19a10 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
19a20 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
19a30 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
19a40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19a50 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
19a60 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
19a70 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
19a80 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
19a90 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
19aa0 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
19ab0 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
19ac0 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
19ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
19ae0 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
19af0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
19b00 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
19b10 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
19b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
19b30 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
19b40 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
19b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19b60 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
19b70 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
19b80 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
19b90 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
19ba0 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
19bb0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33  ase file */.  u3
19bc0 32 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  2 nPage;        
19bd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19be0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19bf0 61 62 61 73 65 20 2a 2f 0a 20 20 75 33 32 20 6e  abase */.  u32 n
19c00 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
19c10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
19c20 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
19c30 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32  se file */.  u32
19c40 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
19c50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19c60 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19c70 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
19c80 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
19c90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19ca0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
19cb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
19cc0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
19cd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19ce0 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
19cf0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
19d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19d10 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
19d20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
19d30 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
19d40 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
19d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19d60 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
19d70 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
19d80 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
19d90 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
19da0 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
19db0 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
19dc0 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
19dd0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
19de0 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
19df0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
19e00 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
19e10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19e20 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74  Bt->pPager, (int
19e30 2a 29 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  *)&nPageFile);. 
19e40 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
19e50 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
19e60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
19e70 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
19e80 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
19e90 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
19ea0 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ile;.  }.  if( (
19eb0 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
19ec0 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74   SQLITE_ResetDat
19ed0 61 62 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20  abase)!=0 ){.   
19ee0 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a   nPage = 0;.  }.
19ef0 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
19f00 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
19f10 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
19f20 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
19f30 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
19f40 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
19f50 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
19f60 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19f70 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20  : R-43737-39999 
19f80 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69  Every valid SQLi
19f90 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
19fa0 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77   begins.    ** w
19fb0 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
19fc0 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68  g 16 bytes (in h
19fd0 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39  ex): 53 51 4c 69
19fe0 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20   74 65 20 66 6f 
19ff0 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20  72 6d.    ** 61 
1a000 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a  74 20 33 00. */.
1a010 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
1a020 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
1a030 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
1a040 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a050 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a060 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1a070 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
1a080 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
1a090 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1a0a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
1a0b0 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
1a0c0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
1a0d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1a0e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1a0f0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
1a100 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
1a110 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
1a120 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a130 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
1a140 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a150 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>2 ){.      go
1a160 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a170 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
1a180 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65   /* If the write
1a190 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20   version is set 
1a1a0 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62  to 2, this datab
1a1b0 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63  ase should be ac
1a1c0 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e  cessed.    ** in
1a1d0 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68   WAL mode. If th
1a1e0 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72  e log is not alr
1a1f0 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20  eady open, open 
1a200 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20  it now. Then .  
1a210 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
1a220 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e  TE_OK and return
1a230 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74   without populat
1a240 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61  ing BtShared.pPa
1a250 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ge1..    ** The 
1a260 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74  caller detects t
1a270 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68  his and calls th
1a280 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1a290 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a  n. This is.    *
1a2a0 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68  * required as th
1a2b0 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67  e version of pag
1a2c0 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  e 1 currently in
1a2d0 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65   the page1 buffe
1a2e0 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  r.    ** may not
1a2f0 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76   be the latest v
1a300 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d  ersion - there m
1a310 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e  ay be a newer on
1a320 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20  e in the log.   
1a330 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f   ** file..    */
1a340 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
1a350 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62  9]==2 && (pBt->b
1a360 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f  tsFlags & BTS_NO
1a370 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _WAL)==0 ){.    
1a380 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
1a390 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a3a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
1a3b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
1a3c0 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
1a3d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a3e0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1a3f0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a400 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  d;.      }else{.
1a410 20 20 20 20 20 20 20 20 73 65 74 44 65 66 61 75          setDefau
1a420 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20  ltSyncFlag(pBt, 
1a430 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
1a440 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
1a450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1a460 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
1a470 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a480 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1a490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1a4a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1a4b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a4c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1a4d0 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  TADB;.    }else{
1a4e0 0a 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c  .      setDefaul
1a4f0 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53  tSyncFlag(pBt, S
1a500 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59  QLITE_DEFAULT_SY
1a510 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20  NCHRONOUS+1);.  
1a520 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1a530 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a540 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68  R-15465-20813 Th
1a550 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69  e maximum and mi
1a560 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70  nimum embedded p
1a570 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72  ayload.    ** fr
1a580 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  actions and the 
1a590 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61  leaf payload fra
1a5a0 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73  ction values mus
1a5b0 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64  t be 64, 32, and
1a5c0 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   32..    **.    
1a5d0 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
1a5e0 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
1a5f0 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
1a600 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
1a610 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
1a620 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
1a630 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
1a640 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1a650 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
1a660 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
1a670 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
1a680 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1a690 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1a6a0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
1a6b0 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
1a6c0 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
1a6d0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
1a6e0 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
1a6f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1a700 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
1a710 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
1a720 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
1a730 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
1a740 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1a750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a760 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65   */.    pageSize
1a770 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
1a780 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
1a790 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  16);.    /* EVID
1a7a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38  ENCE-OF: R-25008
1a7b0 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20  -21688 The size 
1a7c0 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70  of a page is a p
1a7d0 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20  ower of two.    
1a7e0 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ** between 512 a
1a7f0 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69  nd 65536 inclusi
1a800 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ve. */.    if( (
1a810 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
1a820 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c  eSize)!=0.     |
1a830 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  | pageSize>SQLIT
1a840 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
1a850 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
1a860 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20  e<=256 .    ){. 
1a870 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a880 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a890 20 7d 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46   }.    pBt->btsF
1a8a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1a8b0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20  SIZE_FIXED;.    
1a8c0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
1a8d0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
1a8e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a8f0 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
1a900 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
1a910 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
1a920 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
1a930 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
1a940 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
1a950 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1a960 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
1a970 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
1a980 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
1a990 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
1a9a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
1a9b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
1a9c0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
1a9d0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
1a9e0 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
1a9f0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1aa00 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
1aa10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
1aa20 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
1aa30 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
1aa40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1aa50 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
1aa60 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
1aa70 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
1aa80 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
1aa90 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
1aaa0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1aab0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
1aac0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
1aad0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1aae0 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1aaf0 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1ab00 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1ab10 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1ab20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1ab30 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1ab40 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1ab50 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1ab60 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1ab70 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1ab80 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1ab90 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1aba0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1abb0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1abc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1abd0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1abe0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1abf0 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1ac00 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1ac10 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1ac20 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1ac30 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1ac40 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1ac50 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1ac60 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1ac70 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1ac80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ac90 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1aca0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1acb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->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 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1acf0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1ad00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ad10 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69    if( sqlite3Wri
1ad20 74 61 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d  tableSchema(pBt-
1ad30 3e 64 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  >db)==0 && nPage
1ad40 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
1ad50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ad60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ad70 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1ad80 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1ad90 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
1ada0 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34  E-OF: R-28312-64
1adb0 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65  704 However, the
1adc0 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20   usable size is 
1add0 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20  not allowed to. 
1ade0 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68     ** be less th
1adf0 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72  an 480. In other
1ae00 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70   words, if the p
1ae10 61 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c  age size is 512,
1ae20 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
1ae30 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
1ae40 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65  size cannot exce
1ae50 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66  ed 32. */.    if
1ae60 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
1ae70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
1ae80 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
1ae90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
1aea0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1aeb0 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
1aec0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1aed0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
1aee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1aef0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
1af00 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
1af10 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
1af20 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
1af30 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
1af40 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
1af50 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
1af60 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
1af70 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
1af80 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1af90 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
1afa0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
1afb0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
1afc0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
1afd0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
1afe0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
1aff0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
1b000 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
1b010 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
1b020 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
1b030 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
1b040 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
1b050 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
1b060 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
1b070 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
1b080 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
1b090 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
1b0a0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
1b0b0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
1b0c0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
1b0d0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1b0e0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
1b0f0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
1b100 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
1b110 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
1b120 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
1b130 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
1b140 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
1b150 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
1b160 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
1b170 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
1b180 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
1b190 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
1b1a0 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
1b1b0 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
1b1c0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
1b1d0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1b1e0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
1b1f0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1b200 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
1b210 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1b220 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
1b230 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
1b240 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
1b250 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1b260 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
1b270 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
1b280 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
1b290 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
1b2a0 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
1b2b0 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
1b2c0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1b2d0 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
1b2e0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
1b2f0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
1b300 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
1b310 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b320 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
1b330 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
1b340 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
1b350 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
1b360 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1b370 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
1b380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
1b390 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
1b3a0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1b3b0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
1b3c0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
1b3d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1b3e0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1b3f0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1b400 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
1b410 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
1b420 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
1b430 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
1b440 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
1b450 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
1b460 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
1b470 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
1b480 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
1b490 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
1b4a0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
1b4b0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
1b4c0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
1b4d0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
1b4e0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
1b4f0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
1b500 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
1b510 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
1b520 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
1b530 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
1b540 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1b550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1b560 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
1b570 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
1b580 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
1b590 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
1b5a0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
1b5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1b5c0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1b5d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1b5e0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
1b5f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
1b600 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
1b610 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
1b620 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
1b630 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
1b640 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
1b650 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
1b660 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
1b670 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
1b680 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
1b690 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
1b6a0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
1b6b0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
1b6c0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
1b6d0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
1b6e0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
1b6f0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
1b700 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
1b710 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
1b720 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
1b730 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b740 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
1b750 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
1b760 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1b770 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b780 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
1b790 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
1b7a0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
1b7b0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
1b7c0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
1b7d0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
1b7e0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
1b7f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1b800 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
1b810 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b820 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
1b830 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1b840 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b850 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b860 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1b870 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
1b880 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
1b890 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
1b8a0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
1b8b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b8c0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
1b8d0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
1b8e0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
1b8f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1b900 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
1b910 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
1b920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1b930 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1b940 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
1b950 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
1b960 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
1b970 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1b980 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1b990 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1b9a0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1b9b0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1b9c0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1b9d0 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1b9e0 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1b9f0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1ba00 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1ba10 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1ba20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1ba30 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1ba40 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1ba50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1ba60 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1ba70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ba80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ba90 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1baa0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1bab0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1bac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bad0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1bae0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1baf0 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1bb00 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1bb10 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1bb20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1bb30 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1bb40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1bb50 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1bb60 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1bb70 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1bb80 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1bb90 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1bba0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1bbb0 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1bbc0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1bbd0 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1bbe0 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1bbf0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1bc00 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1bc10 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1bc20 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1bc30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc40 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1bc50 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1bc60 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1bc70 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1bc80 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1bc90 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1bca0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1bcb0 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1bcc0 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1bcd0 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1bce0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1bcf0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1bd00 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1bd10 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1bd20 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1bd30 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1bd40 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1bd50 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1bd60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1bd70 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1bd80 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1bd90 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1bda0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1bdb0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1bdc0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1bdd0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1bde0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1bdf0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1be00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1be10 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1be20 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1be30 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1be40 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1be50 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1be60 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1be70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1be80 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1be90 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1bea0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1beb0 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1bec0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1bed0 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1bee0 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1bef0 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1bf00 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1bf10 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1bf20 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1bf30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1bf40 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1bf50 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1bf60 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1bf70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1bf80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1bf90 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1bfa0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1bfb0 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1bfc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bfd0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bfe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1bff0 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1c000 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1c010 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1c020 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1c030 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1c040 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1c050 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1c060 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1c070 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1c080 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1c090 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1c0a0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1c0b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1c0c0 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1c0d0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1c0e0 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1c0f0 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1c100 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1c110 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1c120 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1c130 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1c140 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1c150 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c160 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1c170 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1c180 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1c190 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1c1a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1c1b0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1c1c0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1c1d0 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1c1e0 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1c1f0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1c200 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1c210 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1c220 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1c230 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1c240 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1c250 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1c260 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1c270 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1c280 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1c290 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1c2a0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1c2b0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1c2c0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1c2d0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1c2e0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1c2f0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1c300 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1c310 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1c320 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1c330 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1c340 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1c350 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1c360 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1c370 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1c380 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1c390 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1c3a0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1c3b0 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1c3c0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1c3d0 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1c3e0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1c3f0 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1c400 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1c410 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1c420 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1c430 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1c440 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1c450 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1c460 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1c470 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1c480 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1c490 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1c4a0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1c4b0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1c4c0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1c4d0 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1c4e0 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1c4f0 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1c500 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1c510 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1c520 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1c530 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1c540 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1c550 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1c560 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1c570 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1c580 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1c590 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1c5a0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1c5b0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1c5c0 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1c5d0 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1c5e0 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1c5f0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1c600 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1c610 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1c620 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1c630 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1c640 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1c650 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1c660 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1c670 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1c680 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1c690 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1c6a0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20  *p, int wrflag, 
1c6b0 69 6e 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73  int *pSchemaVers
1c6c0 69 6f 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ion){.  BtShared
1c6d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1c6e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c6f0 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
1c700 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1c710 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1c720 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1c730 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
1c740 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
1c750 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
1c760 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
1c770 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
1c780 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
1c790 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
1c7a0 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
1c7b0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
1c7c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1c7d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1c7e0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
1c7f0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
1c800 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
1c810 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1c820 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  un;.  }.  assert
1c830 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1c840 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1c850 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56  E || IfNotOmitAV
1c860 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74  (pBt->bDoTruncat
1c870 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  e)==0 );..  if( 
1c880 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  (p->db->flags & 
1c890 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61  SQLITE_ResetData
1c8a0 62 61 73 65 29 20 0a 20 20 20 26 26 20 73 71 6c  base) .   && sql
1c8b0 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
1c8c0 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
1c8d0 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 70 42  ==0 .  ){.    pB
1c8e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1c8f0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
1c900 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1c910 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1c920 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1c930 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1c940 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1c950 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c960 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1c970 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1c980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1c990 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1c9a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1c9b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1c9c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1c9d0 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1c9e0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1c9f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1ca00 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1ca10 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1ca20 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1ca30 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1ca40 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1ca50 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1ca60 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1ca70 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1ca80 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1ca90 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1caa0 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1cab0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1cac0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1cad0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1cae0 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1caf0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1cb00 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1cb10 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1cb20 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1cb30 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1cb40 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1cb50 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1cb60 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1cb70 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1cb80 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1cb90 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1cba0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1cbb0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1cbc0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1cbd0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1cbe0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1cbf0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1cc00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1cc10 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1cc20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1cc30 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1cc40 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1cc50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cc60 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1cc70 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1cc80 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1cc90 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1cca0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1ccb0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1ccc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1ccd0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1cce0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1ccf0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1cd00 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1cd10 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1cd20 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1cd30 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1cd40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1cd50 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1cd60 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1cd70 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1cd80 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1cd90 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1cda0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1cdb0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1cdc0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1cdd0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1cde0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1cdf0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1ce00 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1ce10 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1ce20 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1ce30 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1ce40 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1ce50 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1ce60 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1ce70 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1ce80 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1ce90 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1cea0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1ceb0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1cec0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1ced0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1cee0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1cef0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1cf00 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1cf10 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1cf20 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1cf30 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1cf40 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1cf50 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1cf60 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1cf70 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1cf80 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1cf90 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1cfa0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1cfb0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1cfc0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1cfd0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1cfe0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1cff0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1d000 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1d010 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1d020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1d030 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1d040 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1d050 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1d060 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1d070 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1d080 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1d090 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1d0a0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1d0b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1d0c0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1d0d0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1d0e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d0f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d100 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1d110 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1d120 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1d130 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
1d140 53 59 5f 53 4e 41 50 53 48 4f 54 20 26 26 20 70  SY_SNAPSHOT && p
1d150 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d160 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  n==TRANS_NONE ){
1d170 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66  .          /* if
1d180 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20 74 72   there was no tr
1d190 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
1d1a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1d1b0 69 6f 6e 20 77 61 73 0a 20 20 20 20 20 20 20 20  ion was.        
1d1c0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20    ** called and 
1d1d0 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
1d1e0 53 48 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64  SHOT is returned
1d1f0 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65 72 72  , change the err
1d200 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1d210 63 6f 64 65 20 74 6f 20 53 51 4c 49 54 45 5f 42  code to SQLITE_B
1d220 55 53 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  USY. */.        
1d230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1d240 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
1d250 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1d260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1d280 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1d290 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1d2a0 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1d2b0 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1d2c0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1d2d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1d2e0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1d2f0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1d300 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73  dler(pBt) );.  s
1d310 71 6c 69 74 65 33 50 61 67 65 72 52 65 73 65 74  qlite3PagerReset
1d320 4c 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d  LockTimeout(pBt-
1d330 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  >pPager);..  if(
1d340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d350 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1d360 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1d370 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1d380 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1d390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d3a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1d3b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1d3c0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1d3d0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1d3e0 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1d3f0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1d400 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1d410 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1d420 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1d430 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1d440 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1d450 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1d460 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1d470 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1d480 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1d490 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1d4a0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1d4b0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1d4c0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1d4d0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1d4e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1d4f0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1d500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1d510 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1d520 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1d530 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1d540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d550 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1d560 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1d570 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1d580 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1d590 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1d5a0 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1d5b0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1d5c0 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1d5d0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1d5e0 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1d5f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1d600 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1d610 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1d620 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1d630 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1d640 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1d650 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1d660 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1d670 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1d680 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1d690 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1d6a0 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1d6b0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1d6c0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1d6d0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1d6e0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1d6f0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1d700 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1d710 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1d720 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1d730 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1d740 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1d750 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1d760 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1d770 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1d780 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1d790 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1d7a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d7b0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1d7c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1d7d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d7e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1d7f0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1d800 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1d810 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1d820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d830 20 7d 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a   }..trans_begun:
1d840 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1d860 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29  pSchemaVersion )
1d870 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61  {.      *pSchema
1d880 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79  Version = get4by
1d890 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d8a0 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20  >aData[40]);.   
1d8b0 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1d8c0 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  g ){.      /* Th
1d8d0 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1d8e0 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1d8f0 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1d900 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1d910 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1d920 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1d930 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1d940 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1d950 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
1d960 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1d970 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1d980 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1d990 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1d9a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1d9b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1d9c0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1d9d0 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
1d9e0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
1d9f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65    }.  }..  btree
1da00 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1da10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1da20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1da30 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1da40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1da50 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1da60 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1da70 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1da80 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1da90 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1daa0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1dab0 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1dac0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1dad0 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1dae0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1daf0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1db00 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1db10 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1db20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1db30 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1db40 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  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 20 2f 2a 20 43 6f 75            /* Cou
1db70 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1db80 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 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 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dbb0 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1dbc0 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1dbd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbf0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1dc00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1dc10 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1dc20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1dc30 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1dc40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1dc50 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1dc60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dc70 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1dc80 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1dc90 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1dca0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1dcb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1dcc0 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20  urn rc;.  nCell 
1dcd0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1dce0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1dcf0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1dd00 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1dd10 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1dd20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1dd30 6c 50 74 72 28 70 50 61 67 65 2c 20 70 50 61 67  lPtr(pPage, pPag
1dd40 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1dd50 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1dd60 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1dd70 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1dd80 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1dd90 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1dda0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1ddb0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1ddc0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1ddd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1dde0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1ddf0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1de00 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1de10 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1de20 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1de30 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1de40 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1de50 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1de60 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  &rc);.  }..  ret
1de70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1de80 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1de90 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1dea0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1deb0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1dec0 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1ded0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1dee0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1def0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1df00 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1df10 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1df20 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1df30 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1df40 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1df50 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1df60 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1df70 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1dfa0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1dfb0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1dfc0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1dfd0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1dfe0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1dff0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1e000 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1e010 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1e020 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1e030 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1e040 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1e050 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1e060 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1e070 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1e080 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1e0a0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e0b0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1e0c0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1e0d0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1e0e0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1e0f0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1e100 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1e110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e120 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1e130 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1e140 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1e150 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1e160 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1e170 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1e180 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1e190 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1e1a0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1e1b0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1e1c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1e1d0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1e1e0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1e1f0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1e200 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1e210 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e220 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1e230 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1e240 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1e250 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1e260 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1e270 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1e280 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1e290 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1e2a0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1e2b0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1e2c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1e2d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1e2e0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1e2f0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1e300 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1e310 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1e320 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1e330 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1e340 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e350 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1e360 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1e370 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1e380 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1e390 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1e3a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1e3b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1e3c0 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
1e3d0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1e3e0 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50  +info.nSize > pP
1e3f0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1e400 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1e410 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1e420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e430 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1e440 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1e450 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
1e460 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1e470 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1e480 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1e490 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b   put4byte(pCell+
1e4a0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54  info.nSize-4, iT
1e4b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
1e4c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1e4d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e4e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e4f0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1e500 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1e510 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e520 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1e530 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e550 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1e560 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1e570 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1e580 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1e590 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1e5a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1e5b0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1e5c0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1e5d0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1e5e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e5f0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1e600 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1e610 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1e620 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1e630 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1e640 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1e650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1e660 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1e670 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1e680 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1e690 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1e6a0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1e6b0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1e6c0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1e6d0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1e6e0 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1e6f0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1e700 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1e710 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1e720 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1e730 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1e740 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1e750 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1e760 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1e770 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1e780 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1e790 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1e7a0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1e7b0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1e7c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1e7d0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1e7e0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1e7f0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1e800 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1e810 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1e820 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1e830 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e850 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1e860 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1e870 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1e880 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1e890 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e8a0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1e8b0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1e8c0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1e8d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1e8e0 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1e8f0 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1e900 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1e910 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1e920 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1e930 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1e940 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1e950 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1e960 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1e970 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1e980 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1e990 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1e9a0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1e9b0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1e9c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e9d0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1e9e0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1e9f0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ea00 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1ea10 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1ea20 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1ea30 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1ea40 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1ea50 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1ea60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ea70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ea80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ea90 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1eaa0 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69 66 28  Bt==pBt );.  if(
1eab0 20 69 44 62 50 61 67 65 3c 33 20 29 20 72 65 74   iDbPage<3 ) ret
1eac0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ead0 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d  PT_BKPT;..  /* M
1eae0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1eaf0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1eb00 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1eb10 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1eb20 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1eb30 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1eb40 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1eb50 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1eb60 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1eb70 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1eb80 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1eb90 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1eba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ebb0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1ebc0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1ebd0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1ebe0 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1ebf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ec00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1ec10 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1ec20 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1ec30 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1ec40 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1ec50 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1ec60 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1ec70 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1ec80 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1ec90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1eca0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1ecb0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1ecc0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1ecd0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1ece0 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1ecf0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1ed00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1ed10 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1ed20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1ed30 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1ed40 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1ed50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1ed60 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1ed70 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1ed80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1ed90 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1eda0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1edb0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1edc0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1edd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1ede0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1edf0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1ee00 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1ee10 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1ee20 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ee30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ee50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1ee60 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1ee70 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1ee80 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1ee90 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1eea0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1eeb0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1eec0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1eed0 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1eee0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1eef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ef00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef20 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1ef30 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1ef40 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1ef50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1ef60 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1ef70 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1ef80 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1ef90 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1efa0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1efb0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1efc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1efd0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1efe0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1eff0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1f000 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1f010 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1f020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f030 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1f040 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1f050 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f060 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1f070 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1f080 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f090 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1f0a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1f0b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1f0d0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1f0e0 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1f0f0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1f100 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1f110 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1f120 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f130 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f140 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1f150 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1f160 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1f170 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1f180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f190 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1f1a0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1f1b0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1f1c0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1f1d0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f1e0 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1f1f0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1f200 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1f210 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1f220 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1f230 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1f240 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1f250 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1f260 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1f270 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1f280 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1f290 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1f2a0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1f2b0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1f2c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1f2d0 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1f2e0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1f2f0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1f300 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1f310 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1f320 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1f330 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1f340 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1f350 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1f360 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1f370 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1f380 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1f390 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1f3a0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1f3b0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1f3c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1f3d0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1f3e0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1f3f0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1f400 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1f410 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1f420 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1f430 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1f440 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1f450 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1f460 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1f470 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1f480 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1f490 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1f4a0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1f4b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1f4c0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1f4d0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1f4e0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1f4f0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1f500 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1f510 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1f520 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1f530 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1f540 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1f550 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1f560 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1f570 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1f580 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1f590 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1f5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f5b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1f5c0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1f5d0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1f5e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1f5f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f600 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1f610 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1f620 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1f630 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1f640 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1f650 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1f660 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f670 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1f680 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1f690 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1f6a0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1f6b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f6c0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1f6d0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1f6e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f6f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1f700 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1f710 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1f720 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1f730 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f750 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1f770 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1f780 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1f790 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1f7a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1f7b0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1f7c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1f7d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1f7e0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1f7f0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1f800 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1f810 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
1f820 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1f830 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
1f840 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
1f850 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
1f860 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
1f870 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
1f880 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
1f890 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
1f8a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1f8b0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
1f8c0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
1f8d0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
1f8e0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
1f8f0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
1f900 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f910 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1f920 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
1f930 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1f940 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1f950 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1f960 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1f970 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
1f980 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
1f990 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f9a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f9b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f9c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f9d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1f9e0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
1f9f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fa00 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1fa10 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
1fa20 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
1fa30 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
1fa40 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
1fa50 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
1fa60 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
1fa70 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
1fa80 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
1fa90 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
1faa0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
1fab0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1fac0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1fad0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
1fae0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
1faf0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
1fb00 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1fb10 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1fb20 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
1fb30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1fb40 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
1fb50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1fb60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fb70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fb80 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
1fb90 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
1fba0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
1fbb0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
1fbc0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
1fbd0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
1fbe0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
1fbf0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1fc00 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
1fc10 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
1fc20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1fc30 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
1fc40 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
1fc50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
1fc60 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
1fc70 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
1fc80 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
1fc90 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
1fca0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
1fcb0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
1fcc0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1fcd0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1fce0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1fcf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1fd00 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1fd10 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1fd20 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1fd30 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1fd40 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1fd50 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1fd60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1fd70 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1fd80 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1fd90 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1fda0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fdb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1fdc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1fdd0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1fde0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fdf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1fe00 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1fe10 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1fe20 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1fe30 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1fe40 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1fe50 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1fe60 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1fe70 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1fe80 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1fe90 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1fea0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1feb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1fec0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1fed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1fef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ff00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1ff10 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1ff20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1ff30 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1ff40 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1ff50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ff60 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1ff70 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1ff80 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1ff90 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1ffa0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1ffb0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1ffc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ffd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1ffe0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1fff0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
20000 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
20010 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
20020 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
20030 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
20040 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
20050 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
20060 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
20070 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20080 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
20090 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
200a0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
200b0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
200c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
200d0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
200e0 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
200f0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
20100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20110 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20120 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
20130 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
20140 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20170 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
20180 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
20190 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
201b0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
201c0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
201d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
201e0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
201f0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
20200 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
20210 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
20220 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
20230 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
20240 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
20250 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
20260 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
20270 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20280 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
20290 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
202a0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
202b0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
202c0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
202d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
202e0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
202f0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
20300 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
20310 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
20320 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
20330 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
20340 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
20350 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
20360 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
20370 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
20380 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
20390 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
203a0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
203b0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
203c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
203d0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
203e0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
203f0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
20400 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
20410 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
20420 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20430 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
20440 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
20450 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
20460 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
20470 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
20480 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
20490 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
204a0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
204b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
204c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
204d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
204e0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
204f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20500 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
20510 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
20520 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20530 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
20540 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
20550 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
20560 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
20570 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
20580 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20590 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
205a0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
205b0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
205c0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
205d0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
205e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
205f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
20600 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
20610 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
20620 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
20630 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
20640 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20660 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
20670 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
20680 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
20690 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
206a0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
206b0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
206c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
206d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
206e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
206f0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
20700 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20710 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20720 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20730 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
20740 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
20750 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20770 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
20780 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20790 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
207a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
207b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
207c0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
207d0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
207e0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
207f0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
20800 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
20810 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
20820 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
20830 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
20840 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
20850 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
20860 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
20870 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
20880 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
20890 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
208a0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
208b0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
208c0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
208d0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
208e0 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
208f0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
20900 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
20910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
20920 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
20930 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
20940 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20950 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
20960 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
20970 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
20980 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
20990 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
209a0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
209b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
209c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
209d0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
209e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
209f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
20a00 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
20a10 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
20a20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
20a30 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
20a40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20a50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
20a60 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
20a70 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
20a80 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
20a90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20aa0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
20ab0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
20ac0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
20ad0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
20ae0 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
20af0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
20b00 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
20b10 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
20b20 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
20b30 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
20b40 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
20b50 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
20b60 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
20b70 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
20b80 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
20b90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
20ba0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
20bb0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
20bc0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
20bd0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
20be0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
20bf0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
20c00 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
20c10 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
20c20 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
20c30 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
20c40 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
20c50 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
20c60 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
20c70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20c80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20c90 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
20ca0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
20cb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
20cc0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
20cd0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
20ce0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
20cf0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
20d00 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
20d10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20d20 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
20d30 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
20d40 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
20d50 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
20d60 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
20d70 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
20d80 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
20d90 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
20da0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
20db0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
20dc0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
20dd0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
20de0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
20df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
20e00 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
20e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20e20 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
20e30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
20e40 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
20e50 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20e60 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
20e70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20e80 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20e90 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
20ea0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20eb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
20ec0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
20ed0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
20ee0 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
20ef0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
20f00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
20f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
20f30 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
20f40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
20f50 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
20f60 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
20f70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
20f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
20f90 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
20fa0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
20fb0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
20fc0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
20fd0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
20fe0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
20ff0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
21000 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
21010 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
21020 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
21030 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
21040 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
21050 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
21060 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
21070 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
21080 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
21090 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
210a0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
210b0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
210c0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
210d0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
210e0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
210f0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
21100 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
21110 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
21120 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
21130 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
21140 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
21150 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
21160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
21170 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
21180 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
21190 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
211a0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
211b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
211c0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
211d0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
211e0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
211f0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
21200 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
21210 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
21220 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
21230 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
21240 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
21250 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
21260 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
21270 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
21280 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
21290 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
212a0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
212b0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
212c0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
212d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
212e0 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
212f0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
21300 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
21310 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
21320 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
21330 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
21340 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
21350 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
21360 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
21370 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21380 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
21390 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
213a0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
213b0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
213c0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
213d0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
213e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
213f0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
21400 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
21410 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
21420 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
21430 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21440 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
21450 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
21460 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
21470 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
21480 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
21490 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
214a0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
214b0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
214c0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
214d0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
214e0 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
214f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21500 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
21510 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
21520 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
21530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21540 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21550 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
21560 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
21570 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
21580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
21590 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
215a0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
215b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
215c0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
215d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
215e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
215f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21600 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
21610 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
21620 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
21630 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
21640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21660 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21670 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
21680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
21690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
216a0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
216b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
216c0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
216d0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
216e0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
216f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
21700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
21710 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
21720 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
21730 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
21740 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21750 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21760 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
21770 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
21780 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
21790 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
217a0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
217b0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
217c0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
217d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
217e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
217f0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
21800 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
21810 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21820 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
21830 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
21840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
21850 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
21860 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
21870 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21880 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
21890 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
218a0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
218b0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
218c0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
218d0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
218e0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
218f0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
21900 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
21910 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
21920 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
21930 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
21940 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
21950 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
21960 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
21970 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
21980 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
21990 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
219a0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
219b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
219c0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
219d0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
219e0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
219f0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
21a00 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
21a10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
21a20 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
21a30 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
21a40 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
21a50 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
21a60 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
21a70 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
21a80 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
21a90 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
21aa0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
21ab0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
21ac0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
21ad0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
21ae0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
21af0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
21b00 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
21b10 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
21b20 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
21b30 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
21b40 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
21b50 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
21b60 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
21b70 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
21b80 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
21b90 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
21ba0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
21bb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
21bc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
21bd0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
21be0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
21bf0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
21c00 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
21c10 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
21c20 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
21c30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
21c40 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
21c50 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
21c60 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
21c70 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
21c80 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
21c90 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
21ca0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
21cb0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
21cc0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
21cd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21ce0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
21cf0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
21d00 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
21d10 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
21d20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21d30 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
21d40 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
21d50 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
21d60 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
21d70 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
21d80 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
21d90 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
21da0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
21db0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
21dc0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
21dd0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
21de0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
21df0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
21e00 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
21e10 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
21e20 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
21e30 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
21e40 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
21e50 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
21e60 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
21e70 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
21e80 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
21e90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
21ea0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
21eb0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
21ec0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
21ed0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
21ee0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
21ef0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
21f00 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
21f10 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
21f20 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
21f30 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
21f40 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
21f50 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
21f60 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
21f70 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
21f80 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
21f90 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
21fa0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
21fb0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
21fc0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
21fd0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
21fe0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
21ff0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
22000 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
22010 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
22020 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
22030 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
22040 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
22050 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
22060 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
22070 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
22080 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
22090 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
220a0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
220b0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
220c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
220d0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
220e0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
220f0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
22100 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
22110 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
22120 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
22130 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
22140 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
22150 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
22160 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
22170 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
22180 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
22190 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
221a0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
221b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
221c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
221d0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
221e0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
221f0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
22200 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
22210 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
22220 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
22230 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
22240 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
22250 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
22260 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
22270 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
22280 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
22290 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
222a0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
222b0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
222c0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
222d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
222e0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
222f0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
22300 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
22310 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
22320 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
22330 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
22340 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
22350 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
22360 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
22370 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22380 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
22390 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
223a0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
223b0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
223c0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
223d0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
223e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
223f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
22400 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
22410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22420 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
22430 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22440 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22450 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22460 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
22470 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
22480 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
22490 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
224a0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
224b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
224c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
224d0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
224e0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
224f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
22500 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
22510 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22520 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22540 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
22550 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
22560 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22570 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
22580 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
22590 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
225a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
225b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
225c0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
225d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
225e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
225f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
22600 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
22610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
22620 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22640 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22650 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
22660 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
22670 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
22680 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
22690 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
226a0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
226b0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
226c0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
226d0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
226e0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
226f0 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
22700 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
22710 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
22720 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
22730 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
22740 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
22750 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
22760 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
22770 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
22780 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
22790 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
227a0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
227b0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
227c0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
227d0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
227e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
227f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
22800 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
22810 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
22820 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
22830 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
22840 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
22850 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
22860 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
22870 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
22880 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
22890 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
228a0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
228b0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
228c0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
228d0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
228e0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
228f0 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
22900 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
22910 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
22920 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
22930 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
22940 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
22950 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
22960 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
22970 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
22980 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
22990 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
229a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
229b0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
229c0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
229d0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
229e0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
229f0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
22a00 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
22a10 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
22a20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
22a30 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
22a40 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
22a50 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
22a60 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
22a70 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
22a80 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
22a90 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
22aa0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
22ab0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
22ac0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
22ad0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
22ae0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
22af0 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
22b00 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
22b10 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
22b20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
22b30 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
22b40 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
22b50 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
22b60 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
22b70 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
22b80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
22b90 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
22ba0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
22bb0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
22bc0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
22bd0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
22be0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22bf0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
22c00 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
22c10 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
22c20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22c30 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
22c40 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
22c50 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
22c60 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
22c70 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
22c80 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22c90 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
22ca0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
22cb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22cc0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
22cd0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
22ce0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22cf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22d00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
22d10 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
22d20 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
22d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
22d40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
22d50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
22d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
22d80 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
22d90 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
22da0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
22db0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
22dc0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
22dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
22de0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
22df0 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
22e00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22e10 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
22e20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
22e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
22e40 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
22e50 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
22e60 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
22e70 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
22e80 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
22e90 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
22ea0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
22eb0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
22ec0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
22ed0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22ee0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
22ef0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
22f00 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
22f10 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
22f20 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
22f30 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
22f40 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
22f50 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
22f60 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
22f70 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
22f80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22f90 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
22fa0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
22fb0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
22fc0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
22fd0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
22fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22ff0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
23000 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
23010 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
23020 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
23030 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23040 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
23050 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
23060 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
23070 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
23080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
23090 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
230a0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
230b0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
230c0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
230d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
230e0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
230f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23100 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
23110 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
23120 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
23130 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
23140 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
23150 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
23160 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
23170 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
23180 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
23190 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
231a0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
231b0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
231c0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
231d0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
231e0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
231f0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
23200 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
23210 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
23220 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
23230 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
23240 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
23250 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
23260 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
23270 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
23280 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
23290 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
232a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
232b0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
232c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
232d0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
232e0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
232f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
23300 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
23310 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
23320 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
23330 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
23340 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
23350 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
23360 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
23370 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
23380 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
23390 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
233a0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
233b0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
233c0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
233d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
233e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
233f0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
23400 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
23410 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
23420 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
23430 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
23440 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
23450 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
23460 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
23470 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
23480 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
23490 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
234a0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
234b0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
234c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
234d0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
234e0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
234f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
23500 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
23510 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
23520 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
23530 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
23540 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
23550 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
23560 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
23570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23580 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
23590 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
235a0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
235b0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
235c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
235d0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
235e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
235f0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
23600 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
23610 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
23620 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
23630 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
23640 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
23650 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
23660 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
23670 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
23680 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
23690 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
236a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
236b0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
236c0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
236d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
236e0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
236f0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
23700 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
23710 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
23720 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
23730 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
23740 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
23750 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
23760 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
23770 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
23780 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
23790 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
237a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
237b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
237c0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
237d0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
237e0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
237f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
23800 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
23810 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23820 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
23830 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
23840 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
23850 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
23860 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
23870 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
23880 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
23890 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
238a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
238b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
238c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
238d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
238e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
238f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
23900 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
23910 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
23920 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
23930 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
23940 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
23950 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
23960 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23970 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
23980 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
23990 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
239a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
239b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
239c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
239d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
239e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
239f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
23a00 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
23a10 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
23a20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23a30 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
23a40 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
23a50 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
23a60 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
23a70 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
23a80 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
23a90 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
23aa0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
23ab0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
23ac0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
23ad0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
23ae0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
23af0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
23b00 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
23b10 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
23b20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
23b30 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
23b40 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
23b50 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
23b60 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
23b70 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
23b80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
23b90 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
23ba0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
23bb0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
23bc0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
23bd0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
23be0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
23bf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23c00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
23c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
23c20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
23c30 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
23c40 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
23c50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23c60 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
23c70 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
23c80 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
23c90 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
23ca0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
23cb0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
23cc0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
23cd0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
23ce0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
23cf0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
23d00 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
23d10 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
23d20 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
23d30 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
23d40 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
23d50 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
23d60 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
23d70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
23d80 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
23d90 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
23da0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
23db0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
23dc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
23dd0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
23de0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
23df0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
23e00 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
23e10 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
23e20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
23e30 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
23e40 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
23e50 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
23e60 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
23e70 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
23e80 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
23e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
23ea0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
23eb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
23ec0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
23ed0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
23ee0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
23ef0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
23f00 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
23f10 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
23f20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
23f30 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
23f40 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
23f50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
23f60 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
23f70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
23f80 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
23f90 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
23fa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
23fb0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
23fc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
23fd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
23ff0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
24000 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
24010 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
24020 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
24030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24040 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
24050 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
24060 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
24070 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
24080 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
24090 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
240a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
240b0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
240c0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
240d0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
240e0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
240f0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
24100 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
24110 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
24120 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24130 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
24140 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
24150 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
24160 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
24170 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
24180 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
24190 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
241a0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
241b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
241c0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
241d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
241e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
241f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24200 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
24210 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
24220 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
24230 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
24240 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
24250 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
24260 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
24270 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
24280 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
24290 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
242a0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
242b0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
242c0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
242d0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
242e0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
242f0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
24300 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
24310 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
24320 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
24330 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
24340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
24350 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
24360 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
24370 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
24380 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
24390 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
243a0 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
243b0 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
243c0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
243d0 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
243e0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
243f0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
24400 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
24410 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
24420 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
24430 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
24440 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
24450 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
24460 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
24470 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
24480 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
24490 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
244a0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
244b0 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
244c0 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
244d0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
244e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
244f0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
24500 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
24510 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
24520 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
24530 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
24540 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
24550 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
24560 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
24570 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
24580 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
24590 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
245a0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
245b0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
245c0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
245d0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
245e0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
245f0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
24600 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24610 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
24620 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
24630 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
24640 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
24650 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
24660 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
24670 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
24680 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
24690 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
246a0 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
246b0 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
246c0 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
246d0 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
246e0 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
246f0 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
24700 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
24710 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
24720 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
24730 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
24740 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
24750 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
24760 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
24770 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
24780 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
24790 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
247a0 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
247b0 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
247c0 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
247d0 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
247e0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
247f0 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
24800 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
24810 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
24820 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
24830 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
24840 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
24850 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
24860 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
24870 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
24880 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
24890 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
248a0 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
248b0 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
248c0 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
248d0 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
248e0 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
248f0 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
24900 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
24910 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
24920 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
24930 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
24940 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
24950 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
24960 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
24970 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
24980 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
24990 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
249a0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
249b0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
249c0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
249d0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
249e0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
249f0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
24a00 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
24a10 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
24a20 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
24a30 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
24a40 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
24a50 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24a60 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
24a90 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 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 20 2f 2a 20 52 6f 6f 74           /* Root
24ac0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
24ad0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
24ae0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
24af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b00 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
24b10 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
24b20 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
24b30 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
24b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
24b50 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
24b60 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
24b70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
24b80 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
24b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
24ba0 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
24bb0 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
24bc0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
24bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24be0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
24bf0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
24c00 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
24c30 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
24c40 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
24c50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
24c60 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
24c70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24c80 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
24c90 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
24ca0 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
24cb0 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
24cc0 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
24cd0 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
24ce0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
24cf0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
24d00 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
24d10 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
24d20 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
24d30 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
24d40 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
24d50 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
24d60 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
24d70 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
24d80 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
24d90 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
24da0 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
24db0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
24dc0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
24dd0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
24de0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
24df0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
24e00 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
24e10 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
24e20 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
24e30 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
24e40 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
24e50 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
24e60 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
24e70 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
24e80 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
24e90 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
24ea0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
24eb0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
24ec0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
24ed0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
24ee0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
24ef0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
24f00 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
24f10 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
24f20 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
24f30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
24f40 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
24f50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
24f60 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
24f70 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
24f80 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
24f90 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
24fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
24fb0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
24fc0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
24fd0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
24fe0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
24ff0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
25000 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
25010 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
25020 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
25030 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
25040 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
25050 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
25060 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
25070 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
25080 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
25090 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
250a0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
250b0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
250c0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
250d0 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
250e0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
250f0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
25100 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
25110 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
25120 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
25130 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
25140 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
25150 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
25160 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
25170 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
25180 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
25190 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
251a0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
251b0 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
251c0 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
251d0 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
251e0 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
251f0 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
25200 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
25210 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
25220 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
25230 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
25240 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
25250 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
25260 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
25270 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
25280 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25290 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
252a0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
252b0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
252c0 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
252d0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
252e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
252f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
25300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25310 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
25320 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
25330 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *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 20 2f 2a 20 54 68 65 20           /* The 
25360 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
25370 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
253a0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
253b0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
253c0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
253f0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
25400 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
25410 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
25440 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
25450 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    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 20 2f 2a                /*
25480 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
25490 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
254a0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
254b0 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
254c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
254d0 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
254e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
254f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
25500 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
25510 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
25520 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
25530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
25540 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
25550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25560 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25570 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
25580 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
25590 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
255a0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
255b0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
255c0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
255d0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
255e0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
255f0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
25600 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
25610 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
25620 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
25630 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
25640 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
25650 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
25660 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
25670 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
25680 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25690 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
256a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
256b0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
256c0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
256d0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
256e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
256f0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
25700 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
25710 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
25720 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
25730 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
25740 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
25750 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
25760 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
25770 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
25780 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
25790 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
257a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
257b0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
257c0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
257d0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
257e0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
257f0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
25800 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
25810 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
25820 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
25830 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
25840 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
25850 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
25860 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54  tof(BtCursor, BT
25870 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49  CURSOR_FIRST_UNI
25880 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  NIT));.}../*.** 
25890 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
258a0 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
258b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
258c0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
258d0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
258e0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
258f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
25900 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
25910 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
25920 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
25930 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
25940 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
25950 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
25960 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25980 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
25990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
259a0 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
259b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
259c0 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
259d0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
259e0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
259f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25a00 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
25a10 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
25a20 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
25a30 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
25a40 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
25a50 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
25a60 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
25a70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
25a80 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
25a90 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
25aa0 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
25ab0 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
25ac0 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
25ad0 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
25ae0 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
25af0 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
25b00 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
25b10 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
25b20 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
25b30 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
25b40 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
25b50 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
25b60 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
25b70 65 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ee);.    pCur->p
25b80 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
25b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25ba0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
25bb0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
25bc0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
25bd0 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
25be0 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
25bf0 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
25c00 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
25c10 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
25c20 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
25c30 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
25c40 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
25c50 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
25c60 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
25c70 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
25c80 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
25c90 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
25ca0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
25cb0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
25cc0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25cd0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
25ce0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e  EBUG.  static in
25cf0 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28  t cellInfoEqual(
25d00 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c  CellInfo *a, Cel
25d10 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69  lInfo *b){.    i
25d20 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e  f( a->nKey!=b->n
25d30 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Key ) return 0;.
25d40 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c      if( a->pPayl
25d50 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64  oad!=b->pPayload
25d60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
25d70 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64   if( a->nPayload
25d80 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20  !=b->nPayload ) 
25d90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
25da0 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e  ( a->nLocal!=b->
25db0 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20  nLocal ) return 
25dc0 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53  0;.    if( a->nS
25dd0 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20  ize!=b->nSize ) 
25de0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
25df0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74  turn 1;.  }.  st
25e00 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25e10 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25e20 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
25e30 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
25e40 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
25e50 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
25e60 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
25e70 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
25e80 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f   pCur->ix, &info
25e90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
25ea0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c  ORRUPT_DB || cel
25eb0 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f  lInfoEqual(&info
25ec0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29  , &pCur->info) )
25ed0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
25ee0 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
25ef0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
25f00 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
25f10 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
25f20 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
25f30 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
25f40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
25f50 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63  0 ){.    pCur->c
25f60 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
25f70 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
25f80 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
25f90 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e  ur->pPage,pCur->
25fa0 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  ix,&pCur->info);
25fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
25fc0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
25fd0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  r);.  }.}..#ifnd
25fe0 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
25ff0 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
26000 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
26010 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
26020 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
26030 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
26040 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
26050 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
26060 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
26070 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
26080 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
26090 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
260a0 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
260b0 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
260c0 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
260d0 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
260e0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
260f0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
26100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
26110 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
26120 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
26130 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
26140 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26150 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
26160 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69  f /* NDEBUG */.i
26170 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
26180 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42  ursorIsValidNN(B
26190 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
261a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
261b0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  0 );.  return pC
261c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
261d0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
261e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
261f0 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
26200 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64  er key or "rowid
26210 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  " for a table bt
26220 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ree..** This rou
26230 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tine is only val
26240 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  id for a cursor 
26250 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
26260 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e   into a.** ordin
26270 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e  ary table btree.
26280 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
26290 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  points to an ind
262a0 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69  ex btree or.** i
262b0 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72  s invalid, the r
262c0 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f  esult of this ro
262d0 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e  utine is undefin
262e0 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ed..*/.i64 sqlit
262f0 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
26300 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
26310 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
26320 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26330 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
26340 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26350 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
26360 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
26370 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65  urIntKey );.  ge
26380 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
26390 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
263a0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69  info.nKey;.}..#i
263b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
263c0 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
263d0 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  NC./*.** Return 
263e0 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
263f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26400 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
26410 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61  of the.** payloa
26420 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  d to which the c
26430 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
26440 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  g..*/.i64 sqlite
26450 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43  3BtreeOffset(BtC
26460 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26470 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26480 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
264a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
264b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
264c0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
264d0 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75   return (i64)pCu
264e0 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
264f0 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61  *((i64)pCur->pPa
26500 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a  ge->pgno - 1) +.
26510 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
26520 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
26530 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65  ad - pCur->pPage
26540 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64  ->aData);.}.#end
26550 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
26560 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
26570 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UNC */../*.** Re
26580 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
26590 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c  of bytes of payl
265a0 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72  oad for the entr
265b0 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  y that pCur is.*
265c0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
265d0 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61  ting to.  For ta
265e0 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73  ble btrees, this
265f0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f   will be the amo
26600 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  unt.** of data. 
26610 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65   For index btree
26620 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
26630 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26640 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
26650 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
26660 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
26670 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
26680 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
26690 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
266a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
266b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
266c0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
266d0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
266e0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
266f0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
26700 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20  R_VALID..*/.u32 
26710 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
26720 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
26730 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
26740 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26750 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26760 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26770 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26780 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
26790 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
267a0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  rn pCur->info.nP
267b0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ayload;.}../*.**
267c0 20 52 65 74 75 72 6e 20 61 6e 20 75 70 70 65 72   Return an upper
267d0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 69   bound on the si
267e0 7a 65 20 6f 66 20 61 6e 79 20 72 65 63 6f 72 64  ze of any record
267f0 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 0a 2a   for the table.*
26800 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
26810 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  r is pointing in
26820 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  to..**.** This i
26830 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
26840 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67 20 77  n.  Everything w
26850 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ill still work i
26860 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
26870 65 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  e always returns
26880 20 32 31 34 37 34 38 33 36 34 37 20 28 77 68 69   2147483647 (whi
26890 63 68 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  ch is the larges
268a0 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68 61 74  t record.** that
268b0 20 53 51 4c 69 74 65 20 63 61 6e 20 68 61 6e 64   SQLite can hand
268c0 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20 42 75  le) or more.  Bu
268d0 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20 73 6d  t returning a sm
268e0 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69 67 68  aller value migh
268f0 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c 61 72  t.** prevent lar
26900 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ge memory alloca
26910 74 69 6f 6e 73 20 77 68 65 6e 20 74 72 79 69 6e  tions when tryin
26920 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 61  g to interpret a
26930 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64 61 74 72  .** corrupt datr
26940 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
26950 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
26960 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79 20 72  ntation merely r
26970 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a 65 20  eturns the size 
26980 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
26990 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  g.** database fi
269a0 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  le..*/.sqlite3_i
269b0 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
269c0 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65 28 42  eMaxRecordSize(B
269d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
269e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
269f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26a10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26a20 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 65  OR_VALID );.  re
26a30 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 2d 3e  turn pCur->pBt->
26a40 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69  pageSize * (sqli
26a50 74 65 33 5f 69 6e 74 36 34 29 70 43 75 72 2d 3e  te3_int64)pCur->
26a60 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  pBt->nPage;.}../
26a70 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
26a80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
26a90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
26aa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
26ab0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
26ac0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
26ad0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
26ae0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
26af0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
26b00 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
26b10 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
26b20 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
26b30 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
26b40 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
26b50 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
26b60 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
26b70 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
26b80 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
26b90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
26ba0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
26bb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
26bc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
26bd0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
26be0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
26bf0 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
26c00 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
26c10 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
26c20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
26c30 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
26c40 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
26c50 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
26c60 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
26c70 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
26c80 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
26c90 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
26ca0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
26cb0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
26cc0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
26cd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
26ce0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
26cf0 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
26d00 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
26d10 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
26d20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
26d30 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
26d40 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
26d50 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
26d60 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
26d70 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
26d80 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
26d90 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
26da0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
26db0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
26dc0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
26dd0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
26de0 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
26df0 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
26e00 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
26e10 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
26e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
26e30 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
26e40 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
26e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e60 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
26e70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
26e80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e90 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
26ea0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
26eb0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
26ec0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
26ed0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
26ee0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
26ef0 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
26f00 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26f20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
26f30 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
26f40 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
26f50 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
26f60 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
26f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26f80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
26f90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
26fa0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
26fb0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
26fc0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
26fd0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26fe0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
26ff0 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
27000 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
27010 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
27020 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
27030 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
27040 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
27050 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
27060 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
27070 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
27080 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
27090 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
270a0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
270b0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
270c0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
270d0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
270e0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
270f0 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
27100 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
27110 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
27120 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
27130 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
27140 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
27150 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
27160 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
27170 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
27180 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
27190 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
271a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
271b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
271c0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
271d0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
271e0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
271f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
27200 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
27210 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
27220 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
27230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27240 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
27250 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
27260 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
27270 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
27280 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
27290 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
272a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
272b0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
272c0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
272d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
272e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
272f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
27300 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27310 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
27320 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41  (ppPage==0) ? PA
27330 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
27340 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
27350 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
27360 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a   || pPage==0 );.
27370 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27380 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
27390 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
273a0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
273b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e    }.  }..  *pPgn
273c0 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20  oNext = next;.  
273d0 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20  if( ppPage ){.  
273e0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
273f0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
27400 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
27410 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
27420 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
27430 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  E ? SQLITE_OK : 
27440 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
27450 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
27460 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
27470 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
27480 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
27490 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
274a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
274b0 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
274c0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
274d0 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
274e0 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
274f0 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
27500 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
27510 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
27520 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
27530 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
27540 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
27550 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
27560 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27570 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
27580 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
27590 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
275a0 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
275b0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
275c0 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
275d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
275e0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
275f0 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
27600 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
27610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
27620 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
27630 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
27640 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
27650 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
27660 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
27670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27680 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
27690 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
276a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
276b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
276c0 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
276d0 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
276e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
276f0 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
27700 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
27710 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
27720 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
27730 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
27740 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
27750 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
27760 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
27770 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
27780 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
27790 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
277a0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
277b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
277c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
277d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
277e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
277f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
27800 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
27810 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
27820 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
27830 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
27840 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
27850 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
27860 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
27870 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
27880 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
27890 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
278a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
278b0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
278c0 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
278d0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
278e0 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
278f0 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
27900 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
27910 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70  ting to. The eOp
27920 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20  .** argument is 
27930 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66  interpreted as f
27940 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
27950 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  0: The operation
27960 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75   is a read. Popu
27970 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
27980 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a  w cache..**   1:
27990 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
279a0 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c  s a write. Popul
279b0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
279c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   cache..**.** A 
279d0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
279e0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
279f0 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
27a00 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
27a10 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
27a20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
27a30 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
27a40 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
27a50 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
27a60 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
27a70 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
27a80 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
27a90 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
27aa0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
27ab0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
27ac0 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
27ad0 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
27ae0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
27af0 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66   pages.** this f
27b00 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f  unction may allo
27b10 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
27b20 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  nd lazily popula
27b30 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  te.** the overfl
27b40 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
27b50 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
27b60 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
27b70 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
27b80 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
27b90 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
27ba0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
27bb0 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
27bc0 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
27bd0 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
27be0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
27bf0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
27c00 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74  located, it must
27c10 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
27c20 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
27c30 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
27c40 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
27c50 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
27c60 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
27c70 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
27c80 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
27c90 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
27ca0 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
27cb0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
27cc0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
27cd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27ce0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
27cf0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
27d00 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
27d10 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
27d20 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
27d30 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
27d40 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
27d50 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
27d60 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
27d70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
27d80 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
27d90 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
27da0 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
27db0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
27dc0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
27dd0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
27de0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
27df0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
27e00 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
27e10 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
27e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
27e30 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
27e40 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
27e50 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
27e60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
27e70 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
27e80 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
27e90 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
27ea0 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
27eb0 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
27ec0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
27ed0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
27ee0 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
27ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
27f00 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
27f10 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
27f20 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20  r->pPage;       
27f30 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
27f40 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
27f50 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
27f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
27f70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
27f80 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
27f90 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
27fa0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
27fb0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
27fc0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
27fd0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
27fe0 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20  const pBufStart 
27ff0 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53  = pBuf;     /* S
28000 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c  tart of original
28010 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23   out buffer */.#
28020 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
28030 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
28040 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f  rt( eOp==0 || eO
28050 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  p==1 );.  assert
28060 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28070 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
28080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28090 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
280a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
280b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
280c0 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
280d0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
280e0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
280f0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20  info.pPayload;. 
28100 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
28110 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
28120 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
28130 20 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61   assert( aPayloa
28140 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d > pPage->aData
28150 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29   );.  if( (uptr)
28160 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67  (aPayload - pPag
28170 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74  e->aData) > (pBt
28180 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
28190 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
281a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69  ) ){.    /* Tryi
281b0 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
281c0 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
281d0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
281e0 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20  an error.  The. 
281f0 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61     ** conditiona
28200 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c  l above is reall
28210 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50  y:.    **    &aP
28220 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
28230 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
28240 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
28250 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a  sableSize].    *
28260 2a 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20  * but is recast 
28270 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74  into its current
28280 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69   form to avoid i
28290 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20  nteger overflow 
282a0 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a  problems.    */.
282b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
282c0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
282d0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
282e0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
282f0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
28300 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
28310 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
28320 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
28330 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
28340 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
28350 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
28360 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
28370 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
28380 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
28390 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
283a0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
283b0 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
283c0 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
283d0 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
283e0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
283f0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
28400 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
28410 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
28420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
28430 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
28440 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
28450 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28460 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
28470 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
28480 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
28490 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
284a0 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
284b0 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
284c0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
284d0 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
284e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
284f0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
28500 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
28510 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
28520 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
28530 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
28540 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
28550 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
28560 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
28570 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
28580 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
28590 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
285a0 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
285b0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
285c0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
285d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
285e0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
285f0 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
28600 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
28610 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
28620 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
28630 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
28640 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
28650 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
28660 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
28670 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
28680 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
28690 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
286a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
286b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
286c0 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
286d0 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
286e0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
286f0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
28700 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  e;.      if( pCu
28710 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a  r->aOverflow==0.
28720 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a         || nOvfl*
28730 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67 6e 6f  (int)sizeof(Pgno
28740 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ) > sqlite3Mallo
28750 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f 76 65  cSize(pCur->aOve
28760 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29 7b 0a  rflow).      ){.
28770 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
28780 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
28790 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
287a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
287b0 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
287c0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
287d0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
287e0 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
287f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
28810 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
28820 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
28830 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
28840 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
28850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
28860 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
28870 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
28880 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
28890 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
288a0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
288b0 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
288c0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
288d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
288e0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
288f0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
28900 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
28910 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
28920 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
28930 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
28940 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
28950 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
28960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
28970 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
28980 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
28990 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
289a0 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
289b0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
289c0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
289d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
289e0 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
289f0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
28a00 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
28a10 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
28a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28a30 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
28a40 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
28a50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
28a60 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
28a70 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
28a80 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
28a90 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
28aa0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
28ab0 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
28ac0 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
28ad0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
28ae0 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
28af0 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
28b00 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
28b10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
28b20 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
28b30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
28b40 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
28b50 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28b60 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
28b70 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
28b80 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
28b90 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
28ba0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
28bb0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
28bc0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
28bd0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
28be0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
28bf0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
28c00 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
28c10 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
28c20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
28c30 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
28c40 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
28c50 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
28c60 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
28c70 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
28c80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28c90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
28ca0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
28cb0 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
28cc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28cd0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
28ce0 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
28cf0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
28d00 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
28d10 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
28d20 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
28d30 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
28d40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28d50 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
28d60 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
28d70 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
28d80 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
28d90 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
28da0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
28db0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28dc0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
28dd0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
28de0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
28df0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
28e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
28e10 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
28e20 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
28e30 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
28e40 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
28e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
28e60 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
28e70 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
28e80 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
28e90 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
28ea0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
28eb0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
28ec0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
28ed0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
28ee0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
28ef0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
28f00 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
28f10 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
28f20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
28f30 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
28f40 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
28f50 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
28f60 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
28f70 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
28f80 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
28f90 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
28fa0 65 72 65 20 61 72 65 20 6e 6f 20 64 69 72 74 79  ere are no dirty
28fb0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
28fc0 67 65 2d 63 61 63 68 65 0a 20 20 20 20 20 20 20  ge-cache.       
28fd0 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74   **   4) the dat
28fe0 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
28ff0 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
29000 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61    **   5) the pa
29010 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
29020 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20   WAL file.      
29030 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61    **   6) at lea
29040 73 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20  st 4 bytes have 
29050 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61  already been rea
29060 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  d into the outpu
29070 74 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20  t buffer .      
29080 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
29090 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
290a0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
290b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
290c0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
290d0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
290e0 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
290f0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
29100 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
29110 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
29120 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
29130 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
29140 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
29150 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
29160 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29170 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( 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 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
291b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
291c0 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==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 20                  
291f0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
29200 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
29210 65 72 44 69 72 65 63 74 52 65 61 64 4f 6b 28 70  erDirectReadOk(p
29220 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
29230 50 61 67 65 29 20 20 20 20 2f 2a 20 28 33 2c 34  Page)    /* (3,4
29240 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ,5) */.         
29250 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
29260 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
29290 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
292a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
292b0 65 20 2a 66 64 20 3d 20 73 71 6c 69 74 65 33 50  e *fd = sqlite3P
292c0 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
292d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
292e0 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
292f0 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
29300 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
29310 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29320 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
29330 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
29340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29350 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f 0a  * due to (6) */.
29360 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
29370 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
29380 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
29390 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
293a0 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
293b0 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
293c0 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
293d0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
293e0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
293f0 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
29400 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
29410 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
29420 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
29430 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
29440 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
29450 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
29460 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29470 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
29480 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
29490 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
294a0 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30 20          (eOp==0 
294b0 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
294c0 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
294d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
294e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
294f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29500 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
29510 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
29520 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
29530 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
29540 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
29550 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
29560 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
29570 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
29580 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
29590 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
295a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
295b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
295c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
295d0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
295e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
295f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
29600 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
29610 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65 74  if( amt==0 ) ret
29620 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
29630 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
29640 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
29650 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
29660 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Idx++;.    }.  }
29670 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
29680 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
29690 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  {.    /* Overflo
296a0 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72 65  w chain ends pre
296b0 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20 20  maturely */.    
296c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
296d0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
296e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
296f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
29700 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
29710 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
29720 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
29730 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
29740 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
29750 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
29760 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
29770 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
29780 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
29790 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
297a0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
297b0 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
297c0 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
297d0 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
297e0 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
297f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
29800 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
29810 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
29820 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
29830 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
29840 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
29850 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
29860 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
29870 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
29880 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29890 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
298a0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
298b0 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
298c0 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
298d0 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
298e0 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
298f0 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
29900 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
29910 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
29920 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
29930 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
29940 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
29950 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
29960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
29970 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
29980 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
29990 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
299a0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
299b0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
299c0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
299d0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
299e0 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
299f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29a00 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
29a10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
29a20 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
29a30 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
29a40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29a50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29a70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29a80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
29a90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
29aa0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
29ab0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
29ac0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
29ad0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
29ae0 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
29af0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
29b00 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
29b10 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
29b20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
29b30 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71 6c  s variant of sql
29b40 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
29b50 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69 66  () works even if
29b60 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
29b70 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43 55  not.** in the CU
29b80 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74 65  RSOR_VALID state
29b90 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  .  It is only us
29ba0 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ed by the sqlite
29bb0 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a  3_blob_read().**
29bc0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
29bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29be0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61 74  IT_INCRBLOB.stat
29bf0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
29c00 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  NE int accessPay
29c10 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20 42  loadChecked(.  B
29c20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a 20  tCursor *pCur,. 
29c30 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20 75   u32 offset,.  u
29c40 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20 2a  32 amt,.  void *
29c50 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72 63  pBuf.){.  int rc
29c60 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  ;.  if ( pCur->e
29c70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
29c80 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
29c90 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
29ca0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
29cb0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29cc0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
29cd0 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43   = btreeRestoreC
29ce0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
29cf0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
29d00 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50 61   ? rc : accessPa
29d10 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
29d20 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
29d30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
29d40 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
29d50 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ked(BtCursor *pC
29d60 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
29d70 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
29d80 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Buf){.  if( pCur
29d90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29da0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
29db0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29dc0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29dd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  ;.    return acc
29de0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
29df0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
29e00 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  uf, 0);.  }else{
29e10 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63 65  .    return acce
29e20 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  ssPayloadChecked
29e30 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
29e40 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d  mt, pBuf);.  }.}
29e50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
29e60 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20  E_OMIT_INCRBLOB 
29e70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
29e80 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
29e90 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
29ea0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
29eb0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
29ec0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
29ed0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
29ee0 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
29ef0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
29f00 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
29f10 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
29f20 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
29f30 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
29f40 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
29f50 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
29f60 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
29f70 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
29f80 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
29f90 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
29fa0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
29fb0 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
29fc0 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
29fd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
29fe0 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
29ff0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a000 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
2a010 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
2a020 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
2a030 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
2a040 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
2a050 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
2a060 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
2a070 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
2a080 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
2a090 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
2a0a0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
2a0b0 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
2a0c0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
2a0d0 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
2a0e0 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
2a0f0 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
2a100 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
2a110 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
2a120 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2a130 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
2a140 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
2a150 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
2a160 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
2a170 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
2a180 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
2a190 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
2a1a0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
2a1b0 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
2a1c0 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
2a1d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
2a1e0 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
2a1f0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
2a200 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
2a210 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
2a220 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a230 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
2a240 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
2a250 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
2a260 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
2a270 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
2a280 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
2a290 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
2a2a0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
2a2b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
2a2c0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2a2d0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
2a2e0 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20  .){.  int amt;. 
2a2f0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
2a300 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
2a310 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67  =0 && pCur->pPag
2a320 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  e);.  assert( pC
2a330 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a340 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2a350 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a360 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2a370 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2a380 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
2a390 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a3a0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a3b0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2a3c0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2a3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a3e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
2a3f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a400 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a410 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  d>pCur->pPage->a
2a420 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
2a430 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
2a440 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a450 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad<pCur->pPage-
2a460 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52  >aDataEnd ||CORR
2a470 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d  UPT_DB);.  amt =
2a480 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
2a490 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28 69  al;.  if( amt>(i
2a4a0 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  nt)(pCur->pPage-
2a4b0 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
2a4c0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
2a4d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
2a4e0 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20 73   is too little s
2a4f0 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
2a500 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74 65   for the expecte
2a510 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a 20  d amount.    ** 
2a520 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e 74  of local content
2a530 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74 20  . Database must 
2a540 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2a550 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
2a560 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d 74  PT_DB );.    amt
2a570 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29 28   = MAX(0, (int)(
2a580 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61  pCur->pPage->aDa
2a590 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
2a5a0 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a 20  fo.pPayload));. 
2a5b0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75 33   }.  *pAmt = (u3
2a5c0 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  2)amt;.  return 
2a5d0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
2a5e0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
2a5f0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
2a600 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
2a610 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
2a620 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
2a630 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
2a640 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
2a650 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
2a660 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
2a670 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
2a680 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2a690 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
2a6a0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
2a6b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
2a6c0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
2a6d0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
2a6e0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
2a6f0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
2a700 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
2a710 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
2a720 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
2a730 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
2a740 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
2a750 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
2a760 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
2a770 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
2a780 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
2a790 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
2a7a0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
2a7b0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
2a7c0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
2a7d0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
2a7e0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
2a7f0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
2a800 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
2a810 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
2a820 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
2a830 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
2a840 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
2a850 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  adFetch(BtCursor
2a860 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
2a870 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
2a880 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
2a890 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
2a8a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a8b0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
2a8c0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
2a8d0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
2a8e0 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
2a8f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
2a900 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
2a910 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
2a920 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a930 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2a940 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
2a950 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
2a960 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
2a970 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
2a980 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
2a990 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
2a9a0 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
2a9b0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
2a9c0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
2a9d0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
2a9e0 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
2a9f0 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
2aa00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2aa10 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
2aa20 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
2aa30 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
2aa40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
2aa50 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2aa60 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2aa70 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2aa80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2aa90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2aaa0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2aab0 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
2aac0 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
2aad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aae0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
2aaf0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2ab00 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
2ab10 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
2ab20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2ab30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
2ab40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2ab50 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2ab60 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2ab70 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2ab80 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2ab90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2aba0 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e  >iPage] = pCur->
2abb0 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  ix;.  pCur->apPa
2abc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2abd0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2abe0 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20   pCur->ix = 0;. 
2abf0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
2ac00 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49    return getAndI
2ac10 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
2ac20 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50 61  Pgno, &pCur->pPa
2ac30 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e  ge, pCur, pCur->
2ac40 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2ac50 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ac60 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
2ac70 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
2ac80 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
2ac90 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
2aca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
2acb0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
2acc0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
2acd0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
2ace0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
2acf0 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
2ad00 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
2ad10 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
2ad20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
2ad30 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
2ad40 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
2ad50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
2ad60 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
2ad70 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
2ad80 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2ad90 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
2ada0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
2adb0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
2adc0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
2add0 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
2ade0 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
2adf0 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
2ae00 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
2ae10 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht 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 20 2a 2a 20 69 6e             ** in
2ae40 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
2ae50 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
2ae60 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
2ae70 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
2ae80 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
2ae90 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
2aea0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
2aeb0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2aec0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2aed0 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
2aee0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2aef0 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
2af00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
2af10 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
2af20 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
2af30 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
2af40 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
2af50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
2af60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
2af70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2af80 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
2af90 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
2afa0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
2afb0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2afc0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2afd0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
2afe0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
2aff0 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2b000 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
2b010 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
2b020 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
2b030 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
2b040 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
2b050 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
2b060 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b070 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
2b080 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b090 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b 0a  MemPage *pLeaf;.
2b0a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b0b0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b0c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b0d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2b0e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2b0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2b100 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
2b110 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  t( pCur->pPage )
2b120 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
2b130 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
2b140 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b150 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
2b160 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b170 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2b180 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 0a  ur->pPage->pgno.
2b190 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
2b1a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b1b0 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
2b1c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b1d0 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
2b1e0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2b1f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2b200 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b210 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2b220 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2b230 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70  ;.  pCur->ix = p
2b240 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b250 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c 65  >iPage-1];.  pLe
2b260 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  af = pCur->pPage
2b270 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20  ;.  pCur->pPage 
2b280 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 2d  = pCur->apPage[-
2b290 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  -pCur->iPage];. 
2b2a0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2b2b0 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a 2f  ull(pLeaf);.}../
2b2c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2b2d0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
2b2e0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
2b2f0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
2b300 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
2b310 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
2b320 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2b330 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
2b340 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
2b350 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
2b360 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
2b370 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
2b380 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
2b390 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
2b3a0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
2b3b0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
2b3c0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
2b3d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
2b3e0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
2b3f0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
2b400 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
2b410 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
2b420 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
2b430 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
2b440 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2b450 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
2b460 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
2b470 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
2b480 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20 74  OR_INVALID and t
2b490 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
2b4a0 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  rns SQLITE_EMPTY
2b4b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
2b4c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
2b4d0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
2b4e0 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f 63  e first cell loc
2b4f0 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
2b500 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c 20  .** (or virtual 
2b510 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
2b520 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
2b530 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
2b540 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
2b550 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2b560 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
2b570 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
2b580 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
2b590 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
2b5a0 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
2b5b0 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
2b5c0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
2b5d0 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
2b5e0 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
2b5f0 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
2b600 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
2b610 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
2b620 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
2b630 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
2b640 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
2b650 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
2b660 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
2b670 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
2b680 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
2b690 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
2b6a0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
2b6b0 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
2b6c0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
2b6d0 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
2b6e0 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
2b6f0 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
2b700 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
2b710 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
2b720 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2b730 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2b740 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
2b750 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
2b760 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2b770 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2b780 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
2b790 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
2b7a0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
2b7b0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2b7c0 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
2b7d0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2b7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2b7f0 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
2b800 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2b810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b820 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52 53  r->eState < CURS
2b830 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 7c  OR_REQUIRESEEK |
2b840 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20  | pCur->iPage<0 
2b850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b860 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c 7c  r->pgnoRoot>0 ||
2b870 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20 29   pCur->iPage<0 )
2b880 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  ;..  if( pCur->i
2b890 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
2b8a0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29  f( pCur->iPage )
2b8b0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2b8c0 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2b8d0 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 77  >pPage);.      w
2b8e0 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69 50  hile( --pCur->iP
2b8f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
2b900 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
2b910 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
2b920 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
2b930 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2b940 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2b950 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20 20  apPage[0];.     
2b960 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b   goto skip_init;
2b970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2b980 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
2b990 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
2b9a0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2b9b0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
2b9c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50  eturn SQLITE_EMP
2b9d0 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TY;.  }else{.   
2b9e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2b9f0 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
2ba00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2ba10 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
2ba20 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20 20  RESEEK ){.      
2ba30 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ba40 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
2ba50 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2ba60 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2ba70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2ba80 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
2ba90 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
2baa0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2bab0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
2bac0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  sor(pCur);.    }
2bad0 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2bae0 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70  InitPage(pCur->p
2baf0 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72  Btree->pBt, pCur
2bb00 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
2bb10 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20 20  r->pPage,.      
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb30 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
2bb40 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
2bb50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bb60 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
2bb70 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2bb80 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
2bb90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2bba0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
2bbb0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
2bbc0 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
2bbd0 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b 0a  >pPage->intKey;.
2bbe0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
2bbf0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2bc00 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
2bc10 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
2bc20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75   );..  /* If pCu
2bc30 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
2bc40 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
2bc50 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
2bc60 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
2bc70 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74  .  ** expected t
2bc80 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
2bc90 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
2bca0 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
2bcb0 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c  Info is.  ** NUL
2bcc0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
2bcd0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
2bce0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
2bcf0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
2bd00 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
2bd10 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
2bd20 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  or. .  **.  ** E
2bd30 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20  arlier versions 
2bd40 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65  of SQLite assume
2bd50 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74  d that this test
2bd60 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a   could not fail.
2bd70 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74    ** if the root
2bd80 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64   page was alread
2bd90 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68  y loaded when th
2bda0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
2bdb0 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a  called (i.e..  *
2bdc0 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65  * if pCur->iPage
2bdd0 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69  >=0). But this i
2bde0 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20  s not so if the 
2bdf0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2be00 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73  upted .  ** in s
2be10 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70  uch a way that p
2be20 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e  age pRoot is lin
2be30 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e  ked into a secon
2be40 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a  d b-tree table .
2be50 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65    ** (or the fre
2be60 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73  elist).  */.  as
2be70 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74  sert( pRoot->int
2be80 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d  Key==1 || pRoot-
2be90 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  >intKey==0 );.  
2bea0 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  if( pRoot->isIni
2beb0 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70  t==0 || (pCur->p
2bec0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f  KeyInfo==0)!=pRo
2bed0 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ot->intKey ){.  
2bee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bef0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43 75  CORRUPT_PAGE(pCu
2bf00 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  r->pPage);.  }..
2bf10 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70  skip_init:  .  p
2bf20 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70  Cur->ix = 0;.  p
2bf30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2bf40 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2bf50 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2bf60 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2bf70 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2bf80 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20  Ovfl);..  pRoot 
2bf90 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2bfa0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
2bfb0 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
2bfc0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2bfd0 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
2bfe0 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
2bff0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
2c000 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
2c010 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
2c020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2c030 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
2c040 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
2c050 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
2c060 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
2c070 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
2c080 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2c090 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
2c0a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2c0b0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
2c0c0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
2c0d0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2c0e0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  NVALID;.    rc =
2c0f0 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2c100 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c110 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
2c120 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
2c130 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
2c140 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
2c150 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
2c160 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
2c170 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
2c180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
2c190 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
2c1a0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
2c1b0 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
2c1c0 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
2c1d0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2c1e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2c1f0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
2c200 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
2c210 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
2c220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c230 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c240 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2c250 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2c260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2c270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2c280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c290 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2c2a0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
2c2b0 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2c2c0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
2c2d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2c2e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2c2f0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2c300 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2c310 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b 0a  ge, pCur->ix));.
2c320 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2c330 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
2c340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c350 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2c360 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2c370 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
2c380 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
2c390 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
2c3a0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
2c3b0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2c3c0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
2c3d0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
2c3e0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
2c3f0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
2c400 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
2c410 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2c420 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
2c430 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
2c440 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
2c450 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
2c460 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
2c470 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
2c480 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
2c490 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
2c4a0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
2c4b0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
2c4c0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
2c4d0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
2c4e0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
2c4f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
2c500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2c510 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
2c520 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2c530 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2c540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c550 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c560 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
2c570 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2c580 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2c590 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2c5a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2c5b0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  ID );.  while( !
2c5c0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  (pPage = pCur->p
2c5d0 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  Page)->leaf ){. 
2c5e0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
2c5f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2c600 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2c610 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2c620 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2c630 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
2c640 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2c650 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
2c660 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2c670 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70  }.  pCur->ix = p
2c680 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2c690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c6a0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2c6b0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2c6c0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2c6d0 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
2c6e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2c6f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
2c700 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c710 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2c720 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2c730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2c740 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2c750 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2c760 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2c770 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2c780 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2c790 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2c7a0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2c7b0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2c7c0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2c7d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2c7e0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2c7f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
2c800 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2c810 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2c820 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2c830 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2c840 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2c850 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
2c860 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2c870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c880 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c890 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2c8a0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  ll>0 );.    *pRe
2c8b0 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2c8c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2c8d0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Cur);.  }else if
2c8e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2c8f0 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2c900 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c910 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2c920 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2c930 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2c940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c950 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2c960 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2c970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
2c980 6e 6f 2d 6f 70 20 69 66 20 63 75 72 73 6f 72 20  no-op if cursor 
2c990 70 43 75 72 20 64 6f 65 73 20 6e 6f 74 20 70 6f  pCur does not po
2c9a0 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 72  int to a valid r
2c9b0 6f 77 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  ow..** Otherwise
2c9c0 2c 20 69 66 20 70 43 75 72 20 69 73 20 76 61 6c  , if pCur is val
2c9d0 69 64 2c 20 63 6f 6e 66 69 67 75 72 65 20 69 74  id, configure it
2c9e0 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
2c9f0 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c  t call to.** sql
2ca00 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2ca10 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23  is a no-op..*/.#
2ca20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ca30 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 76 6f  IT_WINDOWFUNC.vo
2ca40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
2ca50 6b 69 70 4e 65 78 74 28 42 74 43 75 72 73 6f 72  kipNext(BtCursor
2ca60 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 57 65   *pCur){.  /* We
2ca70 20 62 65 6c 69 65 76 65 20 74 68 61 74 20 74 68   believe that th
2ca80 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 61 6c  e cursor must al
2ca90 77 61 79 73 20 62 65 20 69 6e 20 74 68 65 20 76  ways be in the v
2caa0 61 6c 69 64 20 73 74 61 74 65 20 77 68 65 6e 0a  alid state when.
2cab0 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e    ** this routin
2cac0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 62 75 74  e is called, but
2cad0 20 74 68 65 20 70 72 6f 6f 66 20 69 73 20 64 69   the proof is di
2cae0 66 66 69 63 75 6c 74 2c 20 73 6f 20 77 65 20 61  fficult, so we a
2caf0 64 64 20 61 6e 0a 20 20 2a 2a 20 41 4c 57 61 59  dd an.  ** ALWaY
2cb00 53 28 29 20 74 65 73 74 20 6a 75 73 74 20 69 6e  S() test just in
2cb10 20 63 61 73 65 20 77 65 20 61 72 65 20 77 72 6f   case we are wro
2cb20 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ng. */.  if( ALW
2cb30 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
2cb40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
2cb50 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2cb60 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49  ate = CURSOR_SKI
2cb70 50 4e 45 58 54 3b 0a 20 20 20 20 70 43 75 72 2d  PNEXT;.    pCur-
2cb80 3e 73 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a 20  >skipNext = 1;. 
2cb90 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
2cba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2cbb0 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76  WFUNC */../* Mov
2cbc0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2cbd0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2cbe0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
2cbf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
2cc00 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
2cc10 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
2cc20 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
2cc30 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
2cc40 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
2cc50 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
2cc60 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2cc70 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2cc80 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
2cc90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2cca0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2ccb0 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
2ccc0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ccd0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2cce0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ccf0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2cd00 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2cd10 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2cd20 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
2cd30 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
2cd40 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
2cd50 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
2cd60 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
2cd70 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
2cd80 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2cd90 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2cda0 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  !=0 ){.#ifdef SQ
2cdb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
2cdc0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
2cdd0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
2cde0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2cdf0 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
2ce00 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
2ce10 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2ce20 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
2ce30 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
2ce40 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
2ce50 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
2ce60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ce70 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
2ce80 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
2ce90 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
2cea0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ceb0 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65  >ix==pCur->pPage
2cec0 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
2ced0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cee0 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  Page->leaf );.#e
2cef0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2cf00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2cf10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2cf20 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2cf30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cf40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cf50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2cf60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70  _VALID );.    *p
2cf70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Res = 0;.    rc 
2cf80 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2cf90 74 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  t(pCur);.    if(
2cfa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cfb0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  {.      pCur->cu
2cfc0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41  rFlags |= BTCF_A
2cfd0 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tLast;.    }else
2cfe0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  {.      pCur->cu
2cff0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2d000 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20  AtLast;.    }.  
2d010 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2d020 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2d030 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d040 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2d050 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2d060 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
2d070 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
2d080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2d090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d0a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2d0b0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
2d0c0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
2d0d0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
2d0e0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
2d0f0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
2d100 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
2d110 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
2d120 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
2d130 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
2d140 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
2d150 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
2d160 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
2d170 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
2d180 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
2d190 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
2d1a0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
2d1b0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
2d1c0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
2d1d0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2d1e0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
2d1f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
2d200 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
2d210 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
2d220 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
2d230 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
2d240 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
2d250 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
2d260 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
2d270 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
2d280 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
2d290 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
2d2a0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
2d2b0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
2d2c0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
2d2d0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
2d2e0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
2d2f0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
2d300 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
2d310 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
2d320 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
2d330 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
2d340 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2d350 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
2d360 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2d370 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2d380 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2d390 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2d3a0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
2d3b0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2d3c0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
2d3d0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
2d400 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
2d410 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
2d420 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
2d430 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
2d440 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2d450 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2d460 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
2d480 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
2d490 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2d4a0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
2d4b0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2d4c0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2d4d0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2d4e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2d4f0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
2d500 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2d510 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e  ey..**.** For in
2d520 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20  dex tables, the 
2d530 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20  pIdxKey->eqSeen 
2d540 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2d550 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78  1 if there.** ex
2d560 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e  ists an entry in
2d570 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2d580 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2d590 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e  pIdxKey.  .*/.in
2d5a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2d5b0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2d5c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d5e0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2d5f0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2d600 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2d610 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2d620 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2d630 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2d640 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2d650 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2d660 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2d670 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2d680 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2d690 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2d6a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d6c0 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2d6d0 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2d6e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2d6f0 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2d700 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2d710 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2d720 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2d730 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d740 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d750 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2d760 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2d770 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
2d780 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
2d790 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
2d7a0 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73  Info==0) );.  as
2d7b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2d7c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d7d0 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29   || (pIdxKey==0)
2d7e0 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  ==(pCur->curIntK
2d7f0 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ey!=0) );..  /* 
2d800 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2d810 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2d820 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2d830 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2d840 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2d850 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2d860 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2d870 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2d880 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26   pIdxKey==0.   &
2d890 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
2d8a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
2d8b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d8c0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
2d8d0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66  )!=0.  ){.    if
2d8e0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2d8f0 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2d900 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2d910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d920 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2d930 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2d940 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2d950 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
2d960 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2d970 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20  tLast)!=0 ){.   
2d980 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
2d990 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d9a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d9b0 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74   }.      /* If t
2d9c0 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79  he requested key
2d9d0 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   is one more tha
2d9e0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b  n the previous k
2d9f0 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ey, then.      *
2da00 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65  * try to get the
2da10 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  re using sqlite3
2da20 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68  BtreeNext() rath
2da30 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20  er than a full. 
2da40 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73       ** binary s
2da50 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20  earch.  This is 
2da60 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
2da70 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65  only.  The corre
2da80 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20  ct answer.      
2da90 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61  ** is still obta
2daa0 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69  ined without thi
2dab0 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c  s case, only a l
2dac0 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65  ittle more slowe
2dad0 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ly */.      if( 
2dae0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b  pCur->info.nKey+
2daf0 31 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  1==intKey ){.   
2db00 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2db10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2db20 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2db30 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ur, 0);.        
2db40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2db50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
2db60 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
2db70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2db80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2db90 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2dba0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dbb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2dbc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
2dbd0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2dbe0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2dbf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2dc00 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OK;.        }els
2dc10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e{.          ret
2dc20 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2dc30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2dc40 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b    }..  if( pIdxK
2dc50 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72  ey ){.    xRecor
2dc60 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74  dCompare = sqlit
2dc70 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72  e3VdbeFindCompar
2dc80 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  e(pIdxKey);.    
2dc90 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2dca0 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2dcb0 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  ( pIdxKey->defau
2dcc0 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20  lt_rc==1 .      
2dcd0 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2dce0 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20  efault_rc==0 .  
2dcf0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2dd00 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d  y->default_rc==-
2dd10 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  1.    );.  }else
2dd20 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2dd30 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c  pare = 0; /* All
2dd40 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65   keys are intege
2dd50 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20  rs */.  }..  rc 
2dd60 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2dd70 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
2dd80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dd90 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2dda0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ddb0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2ddc0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2ddd0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2dde0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2ddf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2de00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2de10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2de20 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2de30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2de40 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69  ur->pPage->isIni
2de50 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2de60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2de70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2de80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2de90 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b  ge->nCell > 0 );
2dea0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2deb0 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75  >iPage==0 || pCu
2dec0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2ded0 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49  tKey==pCur->curI
2dee0 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  ntKey );.  asser
2def0 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  t( pCur->curIntK
2df00 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
2df10 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
2df20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
2df30 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
2df40 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
2df50 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2df60 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20  ->pPage;.    u8 
2df70 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df90 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2dfa0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
2dfb0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
2dfc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
2dfd0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2dfe0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
2dff0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
2e000 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
2e010 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
2e020 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
2e030 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
2e040 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
2e050 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
2e060 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
2e070 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
2e080 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
2e090 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
2e0a0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
2e0b0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
2e0c0 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
2e0d0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
2e0e0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
2e0f0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
2e100 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
2e110 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
2e120 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
2e130 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
2e140 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
2e150 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
2e160 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2e170 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e180 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2e190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e1a0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
2e1b0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
2e1c0 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
2e1d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2e1e0 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
2e1f0 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
2e200 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
2e210 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
2e220 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
2e230 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
2e240 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
2e250 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69  ; */.    pCur->i
2e260 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2e270 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
2e280 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
2e290 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2e2a0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
2e2b0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2e2c0 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2e2d0 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2e2e0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2e2f0 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
2e300 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
2e310 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
2e320 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2e330 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
2e340 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2e360 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2e370 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
2e380 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e3a0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
2e3b0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
2e3c0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
2e3d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2e3e0 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
2e3f0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2e400 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
2e410 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
2e420 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
2e430 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e440 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
2e450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2e460 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2e470 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2e480 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
2e490 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2e4a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2e4b0 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
2e4c0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
2e4d0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2e4e0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2e4f0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2e500 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2e510 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2e520 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2e530 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2e540 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e550 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
2e560 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2e570 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2e580 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
2e590 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2e5a0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2e5b0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2e5c0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20  nSize = 0;.     
2e5d0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2e5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
2e5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2e620 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2e630 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2e640 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2e650 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2e660 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2e670 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2e680 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2e690 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2e6a0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2e6b0 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2e6c0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2e6d0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2e6e0 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2e6f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2e700 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2e710 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2e720 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2e730 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2e740 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2e750 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2e760 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2e770 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2e780 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2e790 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2e7a0 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2e7b0 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2e7c0 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2e7d0 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2e7e0 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2e7f0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2e800 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2e810 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2e820 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2e830 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2e840 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2e850 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2e860 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2e870 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2e880 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2e890 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2e8a0 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2e8b0 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2e8c0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2e8d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2e8e0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2e8f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2e900 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2e910 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2e920 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2e930 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2e940 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2e950 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2e960 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2e970 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2e980 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2e990 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2e9a0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2e9b0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2e9c0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2e9d0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2e9e0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2e9f0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2ea00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2ea10 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2ea20 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2ea30 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2ea40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2ea50 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2ea60 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2ea70 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2ea80 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2ea90 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2eaa0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2eab0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2eac0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2ead0 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2eae0 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2eaf0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2eb00 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2eb10 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2eb20 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2eb30 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2eb40 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2eb50 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2eb60 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2eb70 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2eb80 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2eb90 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2eba0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2ebb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ebc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2ebd0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2ebe0 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2ebf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2ec00 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2ec10 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2ec20 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2ec30 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2ec40 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2ec50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2ec60 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2ec70 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2ec80 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2ec90 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2eca0 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2ecb0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2ecc0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2ecd0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2ece0 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2ecf0 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2ed00 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2ed10 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2ed20 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2ed30 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2ed40 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2ed50 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2ed60 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2ed70 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2ed80 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2ed90 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2eda0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2edb0 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2edc0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2edd0 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2ede0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2edf0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2ee00 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2ee10 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2ee20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2ee30 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2ee40 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2ee50 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2ee60 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2ee70 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2ee80 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2ee90 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2eea0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2eeb0 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2eec0 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2eed0 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2eee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2eef0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2ef00 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2ef10 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2ef20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2ef30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ef40 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2ef50 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2ef60 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2ef70 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2ef80 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2ef90 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2efa0 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2efb0 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2efc0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2efd0 7c 7c 20 6e 43 65 6c 6c 2f 70 43 75 72 2d 3e 70  || nCell/pCur->p
2efe0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 70  Bt->usableSize>p
2eff0 43 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20  Cur->pBt->nPage 
2f000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2f010 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2f020 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
2f030 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f040 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2f050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f060 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2f070 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2f080 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2f090 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2f0a0 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2f0b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f0c0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2f0d0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2f0e0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2f0f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f100 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2f110 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2f120 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
2f130 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
2f140 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
2f150 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
2f160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
2f170 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2f180 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a  BTCF_ValidOvfl;.
2f190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f1a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f1b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2f1c0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2f1d0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2f1e0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2f1f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
2f200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
2f210 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2f220 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2f230 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2f240 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2f250 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2f260 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2f270 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2f280 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2f290 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2f2a0 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2f2b0 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2f2c0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2f2d0 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2f2e0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2f2f0 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2f300 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2f310 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2f320 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2f330 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f340 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2f350 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2f360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f370 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2f380 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2f390 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2f3a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f3b0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2f3c0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2f3d0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2f3e0 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2f3f0 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2f400 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f410 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2f420 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2f430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f440 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2f450 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2f460 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2f470 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2f480 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2f490 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2f4a0 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2f4b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2f4c0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2f4d0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2f4e0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2f4f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f500 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f510 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2f520 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2f530 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43  ert( pCur->ix<pC
2f540 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2f550 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2f560 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2f570 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
2f580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f590 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
2f5a0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2f5b0 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
2f5c0 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
2f5d0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
2f5e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
2f5f0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
2f600 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2f610 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2f620 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f630 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2f640 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2f650 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
2f660 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  }.    pCur->ix =
2f670 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
2f680 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2f690 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
2f6a0 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
2f6b0 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
2f6c0 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
2f6d0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2f6e0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2f6f0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2f700 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2f710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f720 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2f730 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
2f740 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2f750 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
2f760 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
2f770 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
2f780 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
2f790 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
2f7a0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
2f7b0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
2f7c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2f7d0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
2f7e0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
2f7f0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
2f800 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
2f810 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
2f820 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2f830 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2f840 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
2f850 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2f860 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
2f870 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2f880 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
2f890 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
2f8a0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
2f8b0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
2f8c0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
2f8d0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
2f8e0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
2f8f0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
2f900 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
2f910 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
2f920 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
2f930 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
2f940 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
2f950 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2f960 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74  n estimate for t
2f970 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
2f980 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
2f990 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70  hat pCur is.** p
2f9a0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74  ointing to.  Ret
2f9b0 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e  urn a negative n
2f9c0 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69  umber if no esti
2f9d0 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c  mate is currentl
2f9e0 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  y .** available.
2f9f0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
2fa00 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28  treeRowCountEst(
2fa10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2fa20 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69  .  i64 n;.  u8 i
2fa30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2fa40 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2fa50 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2fa60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2fa70 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2fa80 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2fa90 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  ;..  /* Currentl
2faa0 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65  y this interface
2fab0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2fac0 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c  by the OP_IfSmal
2fad0 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c  ler.  ** opcode,
2fae0 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73   and it that cas
2faf0 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c  e the cursor wil
2fb00 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69  l always be vali
2fb10 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  d and.  ** will 
2fb20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20  always point to 
2fb30 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a  a leaf node. */.
2fb40 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
2fb50 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2fb60 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e  _VALID) ) return
2fb70 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   -1;.  if( NEVER
2fb80 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65  (pCur->pPage->le
2fb90 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  af==0) ) return 
2fba0 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d  -1;..  n = pCur-
2fbb0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  >pPage->nCell;. 
2fbc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72   for(i=0; i<pCur
2fbd0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
2fbe0 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70     n *= pCur->ap
2fbf0 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a  Page[i]->nCell;.
2fc00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
2fc10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2fc20 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2fc30 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2fc40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
2fc50 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a  ** Return value:
2fc60 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  .**.**    SQLITE
2fc70 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65  _OK        succe
2fc80 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ss.**    SQLITE_
2fc90 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72  DONE      cursor
2fca0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
2fcb0 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74  ting at the last
2fcc0 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f   element.**    o
2fcd0 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20  therwise        
2fce0 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72  some kind of err
2fcf0 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a  or occurred.**.*
2fd00 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2fd10 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2fd20 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54  3BtreeNext().  T
2fd30 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2fd40 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2fd50 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2fd60 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d  of merely increm
2fd70 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2fd80 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2fd90 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2fda0 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68   next cell on th
2fdb0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2fdc0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2fdd0 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72  reeNext() helper
2fde0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2fdf0 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2fe00 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2fe10 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2fe20 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20  t page or.** to 
2fe30 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2fe40 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74  or..**.** If bit
2fe50 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61   0x01 of the F a
2fe60 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  rgument in sqlit
2fe70 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29  e3BtreeNext(C,F)
2fe80 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a   is 1, then the.
2fe90 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73  ** cursor corres
2fea0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2feb0 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72  index and this r
2fec0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2fed0 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65  e been.** skippe
2fee0 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64  d if the SQL ind
2fef0 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e  ex had been a un
2ff00 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65  ique index.  The
2ff10 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69   F argument.** i
2ff20 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2ff30 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69  implement.  SQLi
2ff40 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2ff50 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2ff60 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e   use.** this hin
2ff70 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f  t, but COMDB2 do
2ff80 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  es..*/.static SQ
2ff90 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2ffa0 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
2ffb0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2ffc0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
2ffd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2ffe0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2fff0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
30000 64 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  d(pCur) );.  if(
30010 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
30020 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
30030 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
30040 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
30050 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
30060 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
30070 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
30080 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
30090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
300a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
300b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
300c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
300d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
300e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
300f0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
30100 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
30110 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
30120 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
30130 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
30140 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
30150 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
30160 70 4e 65 78 74 3e 30 20 29 20 72 65 74 75 72 6e  pNext>0 ) return
30170 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30180 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
30190 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
301a0 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78  idx = ++pCur->ix
301b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
301c0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a  isInit ){.    /*
301d0 20 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20   The only known 
301e0 77 61 79 20 66 6f 72 20 74 68 69 73 20 74 6f 20  way for this to 
301f0 68 61 70 70 65 6e 20 69 73 20 66 6f 72 20 74 68  happen is for th
30200 65 72 65 20 74 6f 20 62 65 20 61 0a 20 20 20 20  ere to be a.    
30210 2a 2a 20 72 65 63 75 72 73 69 76 65 20 53 51 4c  ** recursive SQL
30220 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64   function that d
30230 6f 65 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65  oes a DELETE ope
30240 72 61 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f  ration as part o
30250 66 20 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  f a.    ** SELEC
30260 54 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20  T which deletes 
30270 63 6f 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d  content out from
30280 20 75 6e 64 65 72 20 61 6e 20 61 63 74 69 76 65   under an active
30290 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69   cursor.    ** i
302a0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
302b0 62 61 73 65 20 66 69 6c 65 20 77 68 65 72 65 20  base file where 
302c0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
302d0 44 45 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20  DELETE-ed from. 
302e0 20 20 20 2a 2a 20 68 61 73 20 70 61 67 65 73 20     ** has pages 
302f0 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74  in common with t
30300 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71  he table being q
30310 75 65 72 69 65 64 2e 20 20 53 65 65 20 54 48 33  ueried.  See TH3
30320 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63  .    ** module c
30330 6f 76 31 2f 62 74 72 65 65 37 38 2e 74 65 73 74  ov1/btree78.test
30340 20 74 65 73 74 63 61 73 65 20 32 32 30 20 28 32   testcase 220 (2
30350 30 31 38 2d 30 36 2d 30 38 29 20 66 6f 72 20 61  018-06-08) for a
30360 6e 0a 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65  n.    ** example
30370 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
30380 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
30390 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
303a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
303b0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
303c0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
303d0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
303e0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
303f0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
30400 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
30410 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
30420 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
30430 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
30440 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
30450 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
30460 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
30470 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
30480 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
30490 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
304a0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
304b0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
304c0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
304d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
304e0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
304f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
30500 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
30510 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
30520 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
30530 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30540 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
30550 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
30560 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
30570 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
30580 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
30590 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
305a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
305b0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
305c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
305d0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
305e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
305f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
30600 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
30610 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
30620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30630 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
30640 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
30650 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
30660 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30670 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c  pPage;.    }whil
30680 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61  e( pCur->ix>=pPa
30690 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
306a0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
306b0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
306c0 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
306d0 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ext(pCur, 0);.  
306e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
306f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
30710 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
30720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30730 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
30740 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
30750 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
30760 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    }.}.int sqlite
30770 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
30780 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
30790 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65  lags){.  MemPage
307a0 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45   *pPage;.  UNUSE
307b0 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61  D_PARAMETER( fla
307c0 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69  gs );  /* Used i
307d0 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74  n COMDB2 but not
307e0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a   native SQLite *
307f0 2f 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  /.  assert( curs
30800 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
30810 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
30820 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
30830 61 67 73 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72  ags==1 );.  pCur
30840 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
30850 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
30860 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
30870 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
30880 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43  dOvfl);.  if( pC
30890 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
308a0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
308b0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
308c0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
308d0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
308e0 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
308f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
30900 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
30910 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
30920 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
30930 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
30940 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
30950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
30960 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
30970 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
30980 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
30990 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
309a0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
309b0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
309c0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
309d0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
309e0 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
309f0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
30a00 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
30a10 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
30a20 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
30a30 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
30a40 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
30a50 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
30a60 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
30a70 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
30a80 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
30a90 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
30aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
30ab0 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
30ac0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
30ad0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
30ae0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
30af0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
30b00 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
30b10 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
30b20 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
30b30 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
30b40 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
30b50 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
30b60 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
30b70 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
30b80 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
30b90 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
30ba0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
30bb0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
30bc0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
30bd0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
30be0 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
30bf0 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
30c00 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
30c10 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
30c20 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
30c30 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
30c40 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
30c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
30c60 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
30c70 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
30c80 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
30c90 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
30ca0 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
30cb0 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
30cc0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
30cd0 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
30ce0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
30cf0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
30d00 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
30d10 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
30d20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
30d30 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
30d40 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
30d50 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30d60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
30d70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
30d80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
30d90 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
30da0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
30db0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
30dc0 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42  & (BTCF_AtLast|B
30dd0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
30de0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d  CF_ValidNKey))==
30df0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
30e00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
30e10 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
30e20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30e30 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
30e40 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
30e50 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
30e60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30e70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30e90 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
30ea0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
30eb0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65  tate ){.      re
30ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
30ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30ee0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d  CURSOR_SKIPNEXT=
30ef0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
30f00 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
30f10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
30f20 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
30f30 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
30f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30f50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
30f60 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
30f70 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
30f80 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
30f90 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
30fa0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
30fb0 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  x = pCur->ix;.  
30fc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
30fd0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
30fe0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
30ff0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
31000 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31010 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
31020 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
31030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
31040 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d  hile( pCur->ix==
31050 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
31060 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
31070 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
31080 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
31090 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
310a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
310b0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
310c0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
310d0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
310e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
310f0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
31100 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
31110 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
31120 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
31130 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
31140 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  ix--;.    pPage 
31150 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
31160 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
31170 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
31180 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
31190 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
311a0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30 29  revious(pCur, 0)
311b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
311c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
311d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
311e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
311f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31200 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
31210 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
31220 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
31230 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
31240 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
31250 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
31260 67 73 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45  gs==1 );.  UNUSE
31270 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61  D_PARAMETER( fla
31280 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69  gs );  /* Used i
31290 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74  n COMDB2 but not
312a0 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a   native SQLite *
312b0 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  /.  pCur->curFla
312c0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
312d0 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
312e0 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
312f0 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  y);.  pCur->info
31300 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66  .nSize = 0;.  if
31310 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
31320 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20  CURSOR_VALID.   
31330 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20  || pCur->ix==0. 
31340 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65    || pCur->pPage
31350 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20  ->leaf==0.  ){. 
31360 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
31370 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20  revious(pCur);. 
31380 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b   }.  pCur->ix--;
31390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
313a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
313b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
313c0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
313d0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
313e0 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
313f0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
31400 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
31410 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
31420 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
31430 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
31440 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
31450 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
31460 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
31470 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
31480 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
31490 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
314a0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
314b0 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
314c0 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
314d0 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
314e0 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
314f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
31500 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
31510 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
31520 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
31530 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
31540 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
31550 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
31560 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
31570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
31580 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
31590 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
315a0 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
315b0 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
315c0 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
315d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
315e0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
315f0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
31600 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
31610 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
31620 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
31630 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
31640 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
31650 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
31660 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
31670 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
31680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
31690 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
316a0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
316b0 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
316c0 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
316d0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
316e0 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
316f0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
31700 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
31710 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
31720 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
31730 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
31740 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
31750 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
31760 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
31770 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
31780 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
31790 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
317a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
317b0 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
317c0 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
317d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
317e0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
317f0 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
31800 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
31810 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
31820 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
31830 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
31840 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
31850 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
31860 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
31870 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
31880 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
31890 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
318a0 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
318b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
318c0 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
318d0 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
318e0 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
318f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
31900 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
31910 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
31920 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
31930 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
31940 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
31950 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
31960 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
31970 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
31980 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
31990 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
319a0 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
319b0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
319c0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
319d0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
319e0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
319f0 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
31a00 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
31a10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
31a20 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
31a30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31a40 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
31a50 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
31a60 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
31a70 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
31a80 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
31a90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
31aa0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
31ab0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
31ac0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
31ad0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
31ae0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31af0 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
31b00 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
31b10 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
31b20 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
31b30 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
31b40 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
31b50 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
31b60 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
31b70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31b80 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
31b90 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
31ba0 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
31bb0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
31bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31bd0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
31be0 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
31bf0 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
31c00 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
31c10 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
31c20 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
31c30 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
31c40 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
31c50 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
31c60 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
31c70 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
31c80 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
31c90 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
31ca0 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
31cb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
31cc0 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
31cd0 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
31ce0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31cf0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
31d00 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
31d10 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
31d20 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
31d30 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
31d40 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
31d50 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
31d60 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
31d70 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
31d80 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
31d90 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
31da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31db0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
31dc0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31dd0 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
31de0 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
31df0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
31e00 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
31e10 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
31e20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31e30 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
31e40 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
31e50 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
31e60 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
31e70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
31e80 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31e90 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
31ea0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
31eb0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
31ec0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
31ed0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
31ee0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
31ef0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
31f00 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
31f10 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
31f20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
31f30 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
31f40 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
31f50 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
31f60 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
31f70 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
31f80 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
31f90 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
31fa0 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
31fb0 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
31fc0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31fd0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31fe0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31ff0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32000 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32010 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
32020 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
32030 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
32040 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
32050 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
32060 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
32070 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
32080 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
32090 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
320a0 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
320b0 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
320c0 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
320d0 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
320e0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
320f0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
32100 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
32110 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
32120 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
32130 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
32140 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
32150 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
32160 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
32170 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
32180 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
32190 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
321a0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
321b0 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
321c0 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
321d0 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
321e0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
321f0 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
32200 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
32210 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
32220 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
32230 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
32240 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
32250 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
32260 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
32270 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
32280 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
32290 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
322a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
322b0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
322c0 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
322d0 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
322e0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
322f0 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
32300 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
32310 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
32320 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
32330 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
32340 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
32350 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
32360 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
32370 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
32380 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
32390 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
323a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
323b0 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
323c0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
323d0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
323e0 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
323f0 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
32400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32410 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54  RUPT_PGNO(pPrevT
32420 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e  runk ? pPrevTrun
32430 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20  k->pgno : 1);.  
32440 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32450 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
32460 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
32470 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
32480 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
32490 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
324a0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
324b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
324c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
324d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
324e0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
324f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
32500 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
32510 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
32520 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
32530 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
32540 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
32550 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
32560 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
32570 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
32580 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
32590 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
325a0 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
325b0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
325c0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
325d0 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
325e0 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
325f0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
32600 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
32610 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
32620 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
32630 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
32640 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
32650 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
32660 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
32670 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
32680 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
32690 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
326a0 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
326b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
326c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
326d0 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
326e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
326f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
32700 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32710 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32720 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
32730 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
32740 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
32750 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
32760 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
32770 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
32780 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
32790 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
327a0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
327b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
327c0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
327d0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
327e0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
327f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
32800 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
32810 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
32820 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
32830 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
32840 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
32850 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
32860 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
32870 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
32880 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  (iTrunk);.      
32890 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
328a0 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
328b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
328c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
328d0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
328e0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
328f0 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
32900 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
32910 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
32920 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
32930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
32940 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
32950 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
32960 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
32970 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
32980 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
32990 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
329a0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
329b0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
329c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
329d0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
329e0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
329f0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
32a00 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
32a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32a20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32a30 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
32a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
32a60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32a70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
32a80 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
32a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
32aa0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
32ac0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
32ad0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
32ae0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32af0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
32b00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32b10 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32b20 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
32b30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
32b40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32b60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32b70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32b80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
32b90 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32ba0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
32bb0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
32bc0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32bf0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
32c00 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
32c10 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
32c20 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
32c30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
32c40 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
32c50 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
32c60 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
32c70 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
32c80 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
32c90 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
32ca0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
32cb0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
32cc0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
32cd0 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
32ce0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
32cf0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
32d00 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
32d10 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
32d20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32d30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32d40 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32d50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32d60 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32d80 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
32d90 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
32da0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
32db0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
32dc0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
32dd0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
32de0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
32df0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32e10 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32e20 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32e50 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
32e60 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32e70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32e80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32e90 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
32ea0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
32eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
32ec0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32ed0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
32ee0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
32ef0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
32f00 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
32f10 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32f20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
32f30 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
32f40 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
32f50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32f60 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
32f70 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
32f80 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
32f90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
32fa0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
32fb0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
32fc0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
32fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
32fe0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32ff0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
33000 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
33010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
33020 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
33030 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
33040 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
33050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33060 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33070 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
33080 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
33090 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
330a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
330b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
330c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
330d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
330e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
330f0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
33100 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
33110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33130 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
33140 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
33150 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
33160 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
33170 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
33180 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
33190 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
331a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
331b0 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
331c0 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
331d0 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
331e0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
331f0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
33200 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
33210 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
33220 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
33230 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
33240 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
33250 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
33260 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
33270 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
33280 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
33290 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
332a0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
332b0 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
332c0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
332d0 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
332e0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
332f0 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
33300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
33310 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
33320 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
33330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33340 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
33350 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
33360 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
33370 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
33380 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
33390 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
333a0 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
333b0 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
333c0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
333d0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
333e0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
333f0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
33400 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
33410 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
33420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
33430 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
33470 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
33480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
334a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
334b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
334c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
334d0 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
334e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
334f0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
33500 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
33510 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
33520 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
33530 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
33540 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33550 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
33560 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
33570 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
33580 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
33590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
335a0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
335b0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
335c0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
335d0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
335e0 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
335f0 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
33600 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
33610 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
33620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
33630 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
33640 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
33650 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
33660 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
33670 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
33680 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
33690 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
336a0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
336b0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
336c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336d0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
336e0 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
336f0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
33700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33710 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
33720 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
33730 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
33740 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
33750 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
33760 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
33770 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
33780 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
33790 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
337a0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
337b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
337c0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
337d0 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
337e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
337f0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
33800 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
33810 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
33820 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
33830 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
33840 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33850 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
33860 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
33870 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
33880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
33890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
338a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
338b0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
338c0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
338d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
338e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
338f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
33900 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
33910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33920 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
33930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33950 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
33960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33970 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
33980 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
33990 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
339a0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
339b0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
339c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
339d0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
339e0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
339f0 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
33a00 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
33a10 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
33a20 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
33a30 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
33a40 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
33a50 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
33a60 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
33a70 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
33a80 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
33a90 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
33aa0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
33ab0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
33ac0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
33ad0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
33ae0 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
33af0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
33b00 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
33b10 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
33b20 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
33b30 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
33b40 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
33b50 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
33b60 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
33b70 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
33b80 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
33b90 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
33ba0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
33bb0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
33bc0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
33bd0 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
33be0 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
33bf0 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
33c00 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
33c10 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
33c20 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
33c30 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
33c40 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
33c50 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
33c60 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
33c70 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
33c80 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
33c90 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
33ca0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
33cb0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
33cc0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
33cd0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
33ce0 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
33cf0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
33d00 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
33d10 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
33d20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
33d30 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
33d40 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
33d50 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
33d60 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
33d70 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
33d80 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
33d90 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
33da0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
33db0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
33dc0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
33dd0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
33de0 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
33df0 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
33e00 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
33e10 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
33e20 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
33e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33e40 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
33e50 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
33e60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
33e70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
33e80 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
33e90 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
33ea0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33eb0 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
33ec0 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
33ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
33ee0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
33ef0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
33f00 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
33f10 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
33f20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
33f30 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
33f40 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
33f50 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
33f60 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
33f70 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
33f80 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
33f90 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
33fa0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
33fb0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
33fc0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
33fd0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
33fe0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
33ff0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
34000 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
34010 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
34020 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
34030 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
34040 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
34050 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
34060 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
34070 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34080 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
34090 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
340a0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
340b0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
340c0 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
340d0 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
340e0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
340f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34100 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34110 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34120 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
34130 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
34140 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
34150 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
34160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34170 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
34180 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
34190 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
341a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
341b0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
341c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
341d0 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
341e0 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
341f0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
34200 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
34210 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
34220 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
34230 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
34240 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
34250 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
34260 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
34270 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
34280 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
34290 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
342a0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
342b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
342c0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
342d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
342e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
342f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
34300 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
34310 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
34320 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
34330 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
34340 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
34350 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
34360 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
34370 5f 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50  _DB || *pPgno!=P
34380 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34390 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
343a0 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
343b0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
343c0 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
343d0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
343e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
343f0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
34400 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
34410 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
34420 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61  bPage)<=1 );.  a
34430 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
34440 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65  E_OK || (*ppPage
34450 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  )->isInit==0 );.
34460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34470 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
34480 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
34490 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
344a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
344b0 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
344c0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
344d0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
344e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
344f0 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
34500 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
34510 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
34520 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
34530 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
34540 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
34550 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
34560 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
34570 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
34580 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
34590 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
345a0 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
345b0 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
345c0 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
345d0 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
345e0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
345f0 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
34600 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
34610 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
34620 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
34630 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
34640 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
34650 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
34660 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
34670 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
34680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
34690 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
346a0 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
346b0 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
346c0 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
346d0 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
346f0 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
34700 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
34710 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
34720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34730 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
34740 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
34750 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
34760 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
34770 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
34780 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
34790 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
347a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
347b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
347c0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
347d0 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
347e0 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
347f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
34800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34810 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
34820 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
34830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34840 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
34850 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
34860 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
34870 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
34880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
34890 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
348a0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
348b0 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20  T_DB || iPage>1 
348c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
348d0 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
348e0 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
348f0 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c  );..  if( iPage<
34900 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  2 ) return SQLIT
34910 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34920 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
34930 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
34940 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
34950 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
34960 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
34970 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
34980 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
34990 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
349a0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
349b0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
349c0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
349d0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
349e0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
349f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
34a00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
34a10 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
34a20 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
34a30 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
34a40 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
34a50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
34a60 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
34a70 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
34a80 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
34a90 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
34aa0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
34ab0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
34ac0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
34ad0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
34ae0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
34af0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
34b00 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
34b10 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
34b20 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
34b30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
34b40 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
34b50 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
34b60 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
34b70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
34b80 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
34b90 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
34ba0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34bb0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34bc0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
34bd0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
34be0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
34bf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
34c00 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
34c10 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
34c20 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
34c30 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
34c40 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
34c50 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
34c60 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
34c70 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
34c80 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
34c90 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
34ca0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
34cb0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
34cc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
34cd0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
34ce0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
34cf0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
34d00 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
34d10 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
34d20 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
34d30 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
34d40 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
34d50 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
34d60 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
34d70 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
34d80 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
34d90 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
34da0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
34db0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
34dc0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
34dd0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
34de0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
34df0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
34e00 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
34e10 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
34e20 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
34e30 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
34e40 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
34e50 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
34e60 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
34e70 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
34e80 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
34e90 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
34ea0 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
34eb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
34ec0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
34ed0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
34ee0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
34ef0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
34f00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
34f10 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
34f20 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34f30 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
34f40 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
34f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34f60 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
34f70 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
34f80 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
34f90 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34fa0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
34fb0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
34fc0 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
34fd0 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
34fe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
34ff0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
35000 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35010 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35020 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
35030 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
35040 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
35050 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
35060 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
35070 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
35080 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
35090 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
350a0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
350b0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
350c0 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
350d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
350e0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
350f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
35100 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
35110 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
35120 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
35130 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
35140 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
35150 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
35160 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
35170 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
35180 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
35190 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
351a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
351b0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
351c0 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
351d0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
351e0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
351f0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
35200 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
35210 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
35220 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
35230 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
35240 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
35250 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
35260 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
35270 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
35280 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
35290 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
352a0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
352b0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
352c0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
352d0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
352e0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
352f0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
35300 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
35310 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
35320 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
35330 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
35340 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
35350 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
35360 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
35370 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
35380 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
35390 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
353a0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
353b0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a  /4-8"..      **.
353c0 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
353d0 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31  E-OF: R-19920-11
353e0 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77  576 However, new
353f0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
35400 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20  QLite still.    
35410 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67    ** avoid using
35420 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e   the last six en
35430 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65  tries in the fre
35440 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
35450 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20   array in.      
35460 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61  ** order that da
35470 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65  tabase files cre
35480 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65  ated by newer ve
35490 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
354a0 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a   can be.      **
354b0 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76   read by older v
354c0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
354d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
354e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
354f0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
35500 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
35510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
35530 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
35540 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
35550 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
35560 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
35570 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
35580 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
35590 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
355a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
355b0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
355c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
355d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
355e0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
355f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
35600 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
35610 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
35620 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
35630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
35640 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
35650 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
35660 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
35670 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
35680 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
35690 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
356a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
356b0 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
356c0 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
356d0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
356e0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
356f0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
35700 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
35710 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
35720 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
35730 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
35740 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
35750 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
35760 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
35770 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
35780 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
35790 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
357a0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
357b0 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
357c0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
357d0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
357e0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
357f0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
35800 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
35810 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
35820 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
35830 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
35840 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
35850 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
35860 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
35870 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
35880 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35890 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
358a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
358b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
358c0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
358d0 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
358e0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
358f0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
35900 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
35910 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
35920 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
35930 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
35940 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
35950 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
35960 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
35970 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
35980 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
35990 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
359a0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
359b0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
359c0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
359d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
359e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
359f0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
35a00 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
35a10 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
35a20 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
35a30 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
35a40 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
35a50 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
35a60 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
35a70 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
35a80 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
35a90 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
35aa0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
35ab0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
35ac0 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74   given Cell.  St
35ad0 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f  ore.** size info
35ae0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
35af0 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e  e cell in pInfo.
35b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
35b10 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
35b20 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
35b30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
35b40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
35b50 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
35b60 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
35b70 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
35b80 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
35b90 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
35ba0 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
35bb0 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
35bc0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
35bd0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
35be0 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f  d *pBt;.  Pgno o
35bf0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
35c00 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
35c10 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
35c20 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
35c30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35c40 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
35c50 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
35c60 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
35c70 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
35c80 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e  ;.  if( pInfo->n
35c90 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50  Local==pInfo->nP
35ca0 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65  ayload ){.    re
35cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
35cc0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
35cd0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
35ce0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
35cf0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  hing */.  }.  te
35d00 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20  stcase( pCell + 
35d10 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20  pInfo->nSize == 
35d20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
35d30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
35d40 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e  Cell + (pInfo->n
35d50 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67 65  Size-1) == pPage
35d60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
35d70 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66  if( pCell + pInf
35d80 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65  o->nSize > pPage
35d90 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
35da0 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
35db0 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
35dc0 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ge */.    return
35dd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35de0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
35df0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
35e00 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
35e10 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
35e20 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
35e30 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
35e40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35e50 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
35e60 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
35e70 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
35e80 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e  Ovfl = (pInfo->n
35e90 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d  Payload - pInfo-
35ea0 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  >nLocal + ovflPa
35eb0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
35ec0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
35ed0 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
35ee0 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
35ef0 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  && (pInfo->nPayl
35f00 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
35f10 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
35f20 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
35f30 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
35f40 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
35f50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
35f60 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
35f70 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
35f80 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
35f90 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
35fa0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
35fb0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
35fc0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
35fd0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
35fe0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
35ff0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
36000 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
36010 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
36020 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
36030 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
36040 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
36050 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
36060 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
36070 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
36080 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
36090 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
360a0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
360b0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
360c0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
360d0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
360e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
360f0 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
36100 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
36110 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
36120 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
36130 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
36140 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
36150 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
36160 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
36170 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
36180 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
36190 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
361a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
361b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
361c0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
361d0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
361e0 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
361f0 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
36200 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
36210 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
36220 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
36230 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
36240 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
36250 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
36260 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
36270 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
36280 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
36290 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
362a0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
362b0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
362c0 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
362d0 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
362e0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
362f0 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
36300 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
36310 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
36320 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
36330 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
36340 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
36350 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
36360 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
36370 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
36380 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
36390 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
363a0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
363b0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
363c0 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
363d0 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
363e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
363f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36410 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
36420 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
36430 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
36440 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
36450 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
36460 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
36470 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
36480 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
36490 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
364a0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
364b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
364c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
364d0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
364e0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
364f0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
36500 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
36510 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
36520 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
36530 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
36540 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
36550 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
36560 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
36570 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
36580 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
36590 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
365a0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
365b0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
365c0 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
365d0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
365e0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
365f0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
36600 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
36610 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
36620 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
36630 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
36640 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
36650 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
36660 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
36670 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
36680 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
36690 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
366a0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
366b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
366c0 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
366d0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
366e0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
366f0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
36700 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
36710 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
36720 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
36730 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
36740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
36750 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
36760 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
36770 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a  t BtreePayload *
36780 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  pX,        /* Pa
36790 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68  yload with which
367a0 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
367b0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
367c0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
367d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
367e0 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
367f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
36800 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
36810 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
36820 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e   nSrc, n, rc, mn
36830 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
36840 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  t;.  MemPage *pT
36850 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69  oRelease;.  unsi
36860 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
36870 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
36880 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
36890 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
368a0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a   Pgno pgnoOvfl;.
368b0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
368c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
368d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
368e0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
368f0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
36900 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
36910 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
36920 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
36930 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
36940 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
36950 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
36960 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
36970 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
36980 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
36990 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
369a0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
369b0 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67  [pPage->pBt->pag
369c0 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
369d0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
369e0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
369f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
36a00 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
36a10 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
36a20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d  nHeader = pPage-
36a30 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
36a40 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
36a50 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  ey ){.    nPaylo
36a60 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b  ad = pX->nData +
36a70 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20   pX->nZero;.    
36a80 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61  pSrc = pX->pData
36a90 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d  ;.    nSrc = pX-
36aa0 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >nData;.    asse
36ab0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
36ac0 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c  yLeaf ); /* fill
36ad0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61  InCell() only ca
36ae0 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20  lled for leaves 
36af0 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  */.    nHeader +
36b00 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
36b10 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
36b20 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48  Payload);.    nH
36b30 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
36b40 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
36b50 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e  r], *(u64*)&pX->
36b60 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
36b70 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
36b80 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66  nKey<=0x7fffffff
36b90 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20   && pX->pKey!=0 
36ba0 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50  );.    nSrc = nP
36bb0 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58  ayload = (int)pX
36bc0 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  ->nKey;.    pSrc
36bd0 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20   = pX->pKey;.   
36be0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
36bf0 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
36c00 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
36c10 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  d);.  }.  .  /* 
36c20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
36c30 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61  oad */.  pPayloa
36c40 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
36c50 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  er];.  if( nPayl
36c60 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
36c70 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
36c80 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  his is the commo
36c90 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76 65  n case where eve
36ca0 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20  rything fits on 
36cb0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a 20  the btree page. 
36cc0 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65     ** and no ove
36cd0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
36ce0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
36cf0 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
36d00 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
36d10 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
36d20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
36d30 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
36d40 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
36d50 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61  nSize = n;.    a
36d60 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61  ssert( nSrc<=nPa
36d70 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73  yload );.    tes
36d80 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79  tcase( nSrc<nPay
36d90 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63  load );.    memc
36da0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
36db0 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65  c, nSrc);.    me
36dc0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53  mset(pPayload+nS
36dd0 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d  rc, 0, nPayload-
36de0 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  nSrc);.    retur
36df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
36e00 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
36e10 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
36e20 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  t means that som
36e30 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
36e40 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20   will need.  ** 
36e50 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76  to spill onto ov
36e60 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
36e70 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d  */.  mn = pPage-
36e80 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d  >minLocal;.  n =
36e90 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
36ea0 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
36eb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36ec0 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  - 4);.  testcase
36ed0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
36ee0 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
36ef0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
36f00 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
36f10 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
36f20 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
36f30 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
36f40 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b  .  *pnSize = n +
36f50 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
36f60 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
36f70 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54  nHeader+n];.  pT
36f80 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
36f90 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
36fa0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
36fb0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
36fc0 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
36fd0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
36fe0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
36ff0 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
37000 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
37010 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
37020 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
37030 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
37040 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
37050 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
37060 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
37070 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
37080 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
37090 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
370a0 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
370b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370c0 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
370d0 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
370e0 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
370f0 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
37100 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
37110 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
37120 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
37130 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
37140 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
37150 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
37160 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
37170 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
37180 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
37190 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
371a0 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
371b0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
371c0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
371d0 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
371e0 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
371f0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
37200 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
37210 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
37220 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
37230 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
37240 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
37250 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
37260 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
37270 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
37280 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
37290 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
372a0 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a  ey==pX->nKey );.
372b0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
372c0 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
372d0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
372e0 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
372f0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d  fo.nLocal );.  }
37300 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
37310 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
37320 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
37330 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
37340 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
37350 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
37360 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  ( 1 ){.    n = n
37370 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
37380 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
37390 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
373a0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
373b0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
373c0 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
373d0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
373e0 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
373f0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
37400 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
37410 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
37420 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
37430 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
37440 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
37450 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37460 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
37470 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
37480 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
37490 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
374a0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
374b0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
374c0 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
374d0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
374e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
374f0 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
37500 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
37510 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
37520 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
37530 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
37540 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37550 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37560 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
37570 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  nSrc>=n ){.     
37580 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
37590 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
375a0 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30  }else if( nSrc>0
375b0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53   ){.      n = nS
375c0 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  rc;.      memcpy
375d0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
375e0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
375f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
37600 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
37610 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
37620 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
37630 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65  Payload<=0 ) bre
37640 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64  ak;.    pPayload
37650 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
37660 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
37670 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
37680 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
37690 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
376a0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
376b0 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  pOvfl = 0;.#ifnd
376c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
376d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
376e0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
376f0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
37700 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
37710 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
37720 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
37730 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
37740 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
37750 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
37760 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
37770 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
37780 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
37790 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
377a0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
377b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
377c0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
377d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
377e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
377f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
37800 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
37810 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
37820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37830 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
37840 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37850 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
37860 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
37870 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
37880 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
37890 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
378a0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
378b0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
378c0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
378d0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
378e0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
378f0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
37900 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
37910 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
37920 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
37930 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
37940 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
37950 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
37960 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
37970 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
37980 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
37990 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
379a0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
379b0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
379c0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
379d0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
379e0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
379f0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
37a00 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
37a10 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
37a20 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
37a30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
37a40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37a50 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
37a60 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
37a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37a80 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
37a90 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
37aa0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
37ab0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
37ac0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
37ad0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
37ae0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
37af0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
37b00 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
37b10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
37b20 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
37b30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
37b40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
37b50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37b60 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
37b70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37b80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
37b90 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
37ba0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
37bb0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
37bc0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
37bd0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
37be0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
37bf0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
37c00 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
37c10 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
37c20 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
37c30 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
37c40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37c50 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
37c60 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
37c70 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
37c80 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
37c90 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
37ca0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
37cb0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
37cc0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
37cd0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
37ce0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
37cf0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
37d00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
37d10 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
37d20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
37d30 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37d40 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37d50 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
37d60 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
37d70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
37d80 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
37d90 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
37da0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
37db0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
37dc0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
37dd0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
37de0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
37df0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
37e00 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
37e10 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
37e20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
37e30 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  - 4;.    }.  }. 
37e40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
37e50 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
37e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37e70 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
37e80 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
37e90 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
37ea0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
37eb0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
37ec0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
37ed0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
37ee0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
37ef0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
37f00 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
37f10 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
37f20 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
37f30 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
37f40 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
37f50 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
37f60 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
37f70 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
37f80 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
37f90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
37fa0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
37fb0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
37fc0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
37fd0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
37fe0 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
37ff0 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
38000 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
38010 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
38020 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
38030 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
38040 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
38050 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
38060 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
38070 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
38080 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
38090 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
380a0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
380b0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
380c0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
380d0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
380e0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
380f0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
38100 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
38110 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
38120 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  n;.  assert( idx
38130 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
38140 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
38150 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
38160 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
38170 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
38180 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38190 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
381a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
381b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
381c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
381d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
381e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
381f0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30   pPage->nFree>=0
38200 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
38210 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
38220 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
38230 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
38240 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
38250 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
38260 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
38270 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
38280 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
38290 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
382a0 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
382b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
382c0 29 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e  );.  if( pc+sz >
382d0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
382e0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
382f0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
38300 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
38310 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
38320 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
38330 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
38340 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
38350 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
38360 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  n;.  }.  pPage->
38370 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70  nCell--;.  if( p
38380 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
38390 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
383a0 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
383b0 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
383c0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62  ] = 0;.    put2b
383d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
383e0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  , pPage->pBt->us
383f0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  ableSize);.    p
38400 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
38410 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
38420 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64  Size - pPage->hd
38430 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20  rOffset.        
38440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
38450 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
38460 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73  Size - 8;.  }els
38470 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  e{.    memmove(p
38480 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50  tr, ptr+2, 2*(pP
38490 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78  age->nCell - i