/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a1030989a43bb21fde08fbe26e201009b70956560e5663317106f75c45937ac9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c60: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5c70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5c80: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5c90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5ca0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5cb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5cd0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5ce0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5cf0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d10: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d20: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d30: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d40: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d50: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d60: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5d70: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5d80: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5d90: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5da0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5db0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5dc0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5dd0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5de0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5df0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e00: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e10: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e40: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e50: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e60: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5e70: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5e80: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ea0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5eb0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ec0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5ed0: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5ee0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5ef0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f00: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f10: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f20: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f30: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f40: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f50: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5f70: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5f80: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5f90: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fa0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fb0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5fc0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5fd0: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
5fe0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
5ff0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6000: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6010: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6020: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6030: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6040: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6050: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6060: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
6070: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
6080: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
6090: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60a0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60b0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60c0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
60d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
60e0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
60f0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6100: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6110: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6120: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6130: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6140: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6150: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6160: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
6170: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
6180: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
6190: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61b0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61c0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
61d0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
61e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
61f0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6200: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6210: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6220: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6230: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6240: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6250: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6260: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
6270: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
6280: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
6290: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62a0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62b0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62c0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
62d0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
62e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
62f0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6300: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6310: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6320: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6330: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6340: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6350: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6360: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
6370: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
6380: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
6390: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63a0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63b0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63c0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
63d0: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
63e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
63f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6400: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6410: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6420: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6430: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6440: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6450: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6460: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
6470: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
6480: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
6490: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64a0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64b0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64c0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
64d0: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
64e0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
64f0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6500: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6510: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6530: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6550: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6560: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
6570: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
6580: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
6590: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65a0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65b0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65c0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
65d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
65e0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
65f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6600: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6610: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6620: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6630: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6640: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6660: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6670: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6680: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6690: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66a0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66b0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66c0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
66d0: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
66e0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
66f0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6700: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6710: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6720: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6730: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6740: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6750: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6760: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6770: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6780: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6790: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67a0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67b0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67c0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
67d0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
67e0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
67f0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6800: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6810: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6820: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6830: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6840: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6850: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6860: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6870: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6880: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6890: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68a0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68b0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
68d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
68e0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
68f0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6900: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6910: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6920: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6940: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6970: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6980: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
6990: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69a0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69b0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
69d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
69e0: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
69f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a10: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a40: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a50: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6a70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6a80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6a90: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6aa0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ab0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6ac0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6ad0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6ae0: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6af0: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b00: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b10: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b20: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b30: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b40: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b50: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b60: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6b70: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6b80: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6b90: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6ba0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6bb0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bc0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6bd0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6be0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6bf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c00: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c10: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c20: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c30: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c50: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c60: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6c70: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6c80: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6ca0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6cb0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cc0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6cd0: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6ce0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6cf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d20: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d30: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d40: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d50: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d60: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6d70: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6d80: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6d90: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6da0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6db0: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
6dc0: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
6dd0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6df0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
6e00: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
6e10: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
6e20: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
6e30: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
6e40: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
6e50: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
6e60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
6e70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6e80: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
6e90: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
6ea0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6eb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6ec0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6ed0: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6ee0: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6ef0: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
6f00: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
6f10: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
6f20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6f30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6f40: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
6f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f60: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6f70: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6f80: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6f90: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6fa0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
6fb0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
6fc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
6fd0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
6fe0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
6ff0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7000: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7010: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7020: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7030: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7040: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7050: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7060: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7070: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
7080: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
7090: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
70a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
70b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
70c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
70d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
70e0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
70f0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
7100: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
7110: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7120: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
7130: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7140: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
7150: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
7160: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
7170: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
7180: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
7190: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
71a0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
71b0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
71c0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
71d0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
71e0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
71f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7210: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
7220: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
7230: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
7240: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7250: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
7260: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
7270: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
7280: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
7290: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
72a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
72b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
72c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
72d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
72e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
72f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
7300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7310: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
7320: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7330: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7340: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7350: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
7360: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
7370: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
7380: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
7390: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
73a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
73b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
73c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
73d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
73e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
73f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
7400: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
7410: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
7420: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
7430: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
7440: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
7450: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
7460: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
7470: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
7480: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
7490: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
74a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
74b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
74c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
74d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
74e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
74f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
7500: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
7510: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
7520: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7530: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
7540: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
7550: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
7560: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
7570: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
7580: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
7590: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
75a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
75b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
75c0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
75d0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
75e0: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
75f0: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
7600: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
7610: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
7620: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
7630: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
7640: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
7650: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
7660: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
7670: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
7680: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
7690: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
76a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76b0: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
76c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
76d0: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
76e0: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
76f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7700: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
7710: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
7720: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
7730: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
7740: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
7750: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
7760: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
7770: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
7780: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
7790: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
77a0: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
77b0: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
77c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
77d0: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
77e0: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
77f0: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
7800: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
7810: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7820: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
7830: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
7840: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
7850: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
7860: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
7870: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
7880: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
7890: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
78a0: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
78b0: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
78c0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
78d0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
78e0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
78f0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
7900: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
7910: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
7920: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
7930: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
7940: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
7950: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
7960: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
7970: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
7980: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
7990: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
79a0: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
79b0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
79c0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
79d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
79e0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
79f0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
7a00: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
7a10: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
7a20: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
7a30: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7a40: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7a50: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
7a60: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
7a70: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
7a80: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
7a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
7aa0: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
7ab0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7ac0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7ad0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
7ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7af0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
7b00: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7b10: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
7b20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7b30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
7b40: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7b60: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
7b70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
7b80: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
7b90: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
7ba0: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7bd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7be0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7bf0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c00: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c10: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c20: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c30: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7c40: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7c50: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7c60: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7c70: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7c80: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7c90: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7ca0: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7cb0: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7cc0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7cd0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7ce0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7cf0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d00: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d10: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d20: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d30: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7d40: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7d50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7d60: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7d70: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7da0: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7db0: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7dc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7dd0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7de0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7df0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e00: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e30: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7e40: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7e50: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7e60: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7e70: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7e80: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7e90: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7ea0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7eb0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7ec0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7ed0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7ee0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7ef0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f10: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f20: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f30: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7f40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7f50: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7f60: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7f70: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7f80: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7f90: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7fa0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7fb0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7fc0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
7fd0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
7fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8000: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8010: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8020: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8030: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
8040: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
8050: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
8060: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
8070: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8080: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8090: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
80a0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
80b0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
80c0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
80d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
80e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
80f0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8100: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8120: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8130: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8140: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
8150: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
8160: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
8170: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8180: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8190: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
81a0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
81b0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
81c0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
81d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
81e0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
81f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8200: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8210: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8220: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8230: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
8240: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8250: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8260: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8270: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8280: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8290: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
82b0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
82c0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
82d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
82e0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
82f0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8300: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8320: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8330: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
8340: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8350: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
8360: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8370: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8380: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8390: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
83a0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
83b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
83d0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
83e0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
83f0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8400: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8410: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8420: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8430: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
8440: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
8450: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
8460: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
8470: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
8480: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
8490: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
84a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
84b0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
84c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
84d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
84e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
84f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8500: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8510: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8530: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
8540: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8550: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
8560: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8570: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
8580: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8590: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
85a0: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
85b0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
85c0: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
85d0: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
85e0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
85f0: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8600: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8610: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8620: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8630: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8640: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8650: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8660: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
8670: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
8680: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
8690: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
86a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
86b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
86c0: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
86d0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
86e0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
86f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8700: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8710: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8720: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8730: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8740: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8750: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8760: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8770: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8780: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8790: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
87a0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
87b0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
87c0: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
87d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
87e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
87f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8800: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8810: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8820: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8830: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8840: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8850: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8860: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
8870: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8880: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8890: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
88a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
88b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
88c0: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
88d0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
88e0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
88f0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8900: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8910: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8920: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8930: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8940: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8950: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8960: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8970: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8980: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
89a0: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
89b0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
89c0: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
89d0: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
89e0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
89f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a00: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a30: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8a40: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8a60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8a70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8a90: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8aa0: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8ab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8ad0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8ae0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8af0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b10: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b20: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b30: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8b40: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8b50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8b60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8b70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8b80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8b90: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8ba0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8bb0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8bc0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8bd0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8be0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c10: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c20: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c30: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8c40: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8c50: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8c60: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8c70: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8c80: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8c90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8ca0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8cb0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8cc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8cd0: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8ce0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d00: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8d40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8d50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8d70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8d90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8da0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8db0: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8dc0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8dd0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8de0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8df0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e00: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e10: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e30: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8e40: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8e50: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8e60: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8e70: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8e80: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8e90: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ea0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8eb0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8ec0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8ed0: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8ee0: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8ef0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8f40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8f50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8f60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8f70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8f80: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8f90: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8fa0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8fb0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8fc0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8fd0: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8fe0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8ff0: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9000: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9010: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9020: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9030: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
9040: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
9050: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
9060: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
9070: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
9080: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
9090: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
90a0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
90b0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
90c0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
90d0: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
90e0: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
90f0: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9100: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9110: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9120: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9130: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
9140: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9150: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9160: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9170: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9190: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
91a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
91b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
91d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
91e0: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
91f0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9200: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9210: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9220: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9230: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
9240: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
9250: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
9260: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
9270: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
9280: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
9290: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
92a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
92b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
92c0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
92d0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
92e0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
92f0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9300: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9310: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9320: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9330: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9340: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9350: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9360: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
9370: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
9380: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
9390: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
93a0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
93b0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
93c0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
93d0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
93e0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
93f0: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9400: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9410: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9420: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9430: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9440: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9450: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9460: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
9470: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
9480: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
9490: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
94a0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
94b0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
94c0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
94d0: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
94e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
94f0: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9500: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9510: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9520: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9530: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9540: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9550: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9560: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9570: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
9580: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
9590: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
95a0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
95b0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
95c0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
95d0: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
95e0: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
95f0: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9600: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9610: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9620: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9630: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9640: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9650: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9660: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
9670: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
9680: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
9690: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
96a0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
96b0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
96c0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
96d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
96e0: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
96f0: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9700: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9710: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9720: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9730: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9740: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9750: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9760: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
9770: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
9780: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
9790: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
97a0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
97b0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
97c0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
97d0: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
97e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
97f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9800: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9810: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9820: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9830: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9840: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9860: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9870: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9880: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9890: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
98a0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
98b0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
98c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
98d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
98e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
98f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9900: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9910: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9920: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9930: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9940: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9950: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9960: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
9970: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
9980: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
9990: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
99a0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
99b0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
99c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
99d0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
99e0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
99f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a00: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a10: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9a40: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9a50: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9a60: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9a70: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9a80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9a90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9aa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9ab0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9ac0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9ad0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9ae0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9af0: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b00: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b20: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b30: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9b40: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9b50: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9b60: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9b70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9b80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9b90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9ba0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9bb0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9bc0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9bd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9be0: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9bf0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c00: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c10: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c20: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c30: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9c40: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9c50: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9c60: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9c70: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9c80: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9c90: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9ca0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9cb0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9cc0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9cd0: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9ce0: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9cf0: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d00: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d10: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d20: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d30: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9d40: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9d50: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9d60: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9d70: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9d80: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9d90: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9da0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9db0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9dc0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9dd0: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9de0: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9df0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e00: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e10: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e20: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e30: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9e40: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9e50: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9e60: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9e70: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9e80: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9e90: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ea0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9eb0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9ec0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9ed0: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9ee0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9ef0: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f10: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f20: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9f40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9f50: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9f60: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9f70: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9f80: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9f90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9fa0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9fb0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9fc0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9fd0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9fe0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9ff0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a000: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a010: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a020: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a030: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a040: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a050: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a060: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a070: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a080: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a090: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a0a0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a0b0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a0c0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a0d0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a0e0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a0f0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a100: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a110: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a120: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a130: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a140: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a150: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a160: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a170: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a180: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a190: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a1a0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a1b0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a1c0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a1d0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a1f0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a200: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a210: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a220: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a230: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a240: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a260: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a270: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a280: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a2a0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a2b0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a2c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a2d0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a2e0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a2f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a300: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a310: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a320: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a330: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a340: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a350: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a360: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a370: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a380: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a390: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a3a0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a3b0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a3c0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a3d0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a3e0: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a3f0: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a400: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a410: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a420: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a430: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a440: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a450: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a460: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a470: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a480: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a490: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a4a0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a4b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a4c0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a4d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a4e0: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a4f0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a500: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a510: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a520: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a530: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a540: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a550: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a560: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a570: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a580: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a590: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a5a0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a5b0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a5c0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a5d0: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a5e0: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a5f0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a600: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a610: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a620: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a630: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a640: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a650: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a660: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a670: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a680: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a690: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a6a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a6b0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a6c0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a6d0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a6e0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a6f0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a700: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a710: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a720: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a730: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a740: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a750: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a760: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a770: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a780: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a790: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a7a0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a7b0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a7c0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a7d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a7e0: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a7f0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a800: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a810: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a820: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a830: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a840: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a850: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a860: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a870: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a880: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a890: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a8a0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a8b0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a8c0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a8d0: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a8e0: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a8f0: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a900: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a910: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a920: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a930: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a940: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a950: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a960: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a970: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a980: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a990: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a9a0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a9b0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9e0: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a9f0: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa00: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa30: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aa40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aa50: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aa60: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aa70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aa80: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aa90: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
aaa0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
aab0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
aac0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
aad0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
aae0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
aaf0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab00: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab10: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab20: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab30: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
ab40: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
ab50: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
ab60: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
ab70: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
ab80: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
ab90: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
aba0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
abb0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
abc0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
abd0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
abe0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
abf0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac00: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac10: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac20: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac30: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
ac40: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
ac50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ac60: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
ac70: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ac80: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
ac90: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
aca0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
acb0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
acc0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
acd0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ace0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
acf0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad00: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad10: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad20: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad30: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ad40: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
ad50: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
ad60: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
ad70: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ad80: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ad90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ada0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
adb0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
adc0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
add0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ade0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
adf0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae00: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae10: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae20: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae30: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ae40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ae50: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ae60: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
ae70: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
ae80: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
ae90: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aea0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
aeb0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
aec0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
aed0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
aee0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
aef0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af00: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af10: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af20: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af30: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
af40: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
af50: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
af60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
af70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
af80: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
af90: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
afa0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
afb0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
afc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
afd0: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
afe0: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aff0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b000: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b010: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b020: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b030: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b040: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b050: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b060: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b080: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b090: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b0a0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b0b0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b0c0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b0d0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b0e0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b0f0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b100: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b110: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b120: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b130: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b140: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b150: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b160: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b170: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b180: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b190: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b1a0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b1b0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b1c0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b1d0: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b1e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b1f0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b200: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b210: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b220: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b230: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b240: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b250: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b260: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b270: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b280: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b290: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b2a0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b2b0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b2c0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b2d0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b2e0: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b2f0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b300: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b310: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b320: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b330: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b340: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b350: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b360: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b370: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b380: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b390: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b3a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b3b0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b3c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b3d0: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b3e0: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b3f0: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b400: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b410: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b420: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b430: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b440: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b450: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b460: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b470: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b480: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b490: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b4a0: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b4b0: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b4c0: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b4d0: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b4e0: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b4f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b500: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b510: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b520: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b530: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b540: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b550: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b560: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b570: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b580: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b590: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b5a0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b5b0: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b5c0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b5d0: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b5e0: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b5f0: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b600: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b610: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b620: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b630: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b640: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b650: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b660: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b670: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b680: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b690: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b6a0: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b6b0: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b6c0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b6d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b6e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b6f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b700: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b710: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b720: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b730: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b740: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b750: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b760: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b770: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b780: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b790: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b7a0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b7b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b7c0: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b7d0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b7e0: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b7f0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b800: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b810: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b820: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b830: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b840: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b850: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b860: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b870: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b880: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b890: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b8a0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b8b0: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b8c0: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b8d0: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b8e0: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b8f0: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b900: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b910: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b920: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b930: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b940: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b950: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b960: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b970: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b990: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b9a0: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
b9b0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b9e0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
b9f0: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba10: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba20: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba30: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ba40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
ba50: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
ba60: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
ba70: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
ba80: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
ba90: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
baa0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bab0: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bad0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bae0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
baf0: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb10: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb20: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb30: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bb40: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bb50: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bb60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bb70: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bb80: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bb90: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bba0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bbb0: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bbc0: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bbd0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bbe0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bbf0: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc00: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc10: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc30: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bc40: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bc50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bc60: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bc70: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bc80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bc90: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bca0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bcb0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bcc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bcd0: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bce0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bcf0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd30: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bd40: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bd50: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bd60: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bd70: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bd80: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bd90: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
bda0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
bdb0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
bdc0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
bdd0: 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ) );.  iCellFirs
bde0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
bdf0: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62   2*nCell;.  usab
be00: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
be10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be20: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
be30: 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20  k handles pages 
be40: 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65  with two or fewe
be50: 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e  r free blocks an
be60: 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20  d nMaxFrag.  ** 
be70: 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e  or fewer fragmen
be80: 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68  ted bytes. In th
be90: 69 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61  is case it is fa
bea0: 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65  ster to move the
beb0: 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e  .  ** two (or on
bec0: 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c  e) blocks of cel
bed0: 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65  ls using memmove
bee0: 28 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  () and add the r
bef0: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66  equired.  ** off
bf00: 73 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69  sets to each poi
bf10: 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c  nter in the cell
bf20: 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74  -pointer array t
bf30: 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20  han it is to .  
bf40: 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74  ** reconstruct t
bf50: 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20  he entire page. 
bf60: 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64   */.  if( (int)d
bf70: 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78  ata[hdr+7]<=nMax
bf80: 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Frag ){.    int 
bf90: 69 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65  iFree = get2byte
bfa0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
bfb0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
bfc0: 6e 69 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b  nitial freeblock
bfd0: 20 6f 66 66 73 65 74 20 77 65 72 65 20 6f 75 74   offset were out
bfe0: 20 6f 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74   of bounds, that
bff0: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 68 61   would.    ** ha
c000: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
c010: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
c020: 65 28 29 20 77 68 65 6e 20 69 74 20 77 61 73 20  e() when it was 
c030: 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a 20 20  computing the.  
c040: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66    ** number of f
c050: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
c060: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
c070: 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75 73 61  sert( iFree<=usa
c080: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
c090: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
c0a0: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
c0b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c0c0: 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20 69  iFree]);.      i
c0d0: 66 28 20 69 46 72 65 65 32 3e 75 73 61 62 6c 65  f( iFree2>usable
c0e0: 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72 6e 20  Size-4 ) return 
c0f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c100: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c110: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
c120: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
c130: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
c140: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
c150: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
c160: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c170: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
c180: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
c190: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
c1a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c1b0: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
c1c0: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
c1d0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
c1e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c1f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c200: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
c210: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c230: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
c240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c250: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
c260: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c270: 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29  Free+sz>iFree2 )
c280: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c290: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c2a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  e);.          sz
c2b0: 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  2 = get2byte(&da
c2c0: 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20  ta[iFree2+2]);. 
c2d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
c2e0: 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c 65  ee2+sz2 > usable
c2f0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
c300: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c310: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c320: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
c330: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
c340: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
c350: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
c360: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
c370: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
c380: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
c390: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c3a0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c3b0: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c3c0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c3d0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c3e0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c3f0: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c400: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c410: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c420: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c430: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c440: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c450: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c460: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c470: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c480: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c490: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c4a0: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c4b0: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c4c0: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c4e0: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c4f0: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c500: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c510: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c520: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c530: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c540: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c550: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c560: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c570: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c580: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c590: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c5a0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c5b0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c5c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c5d0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c5e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c5f0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c600: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c610: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c620: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c630: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c640: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c650: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c660: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c670: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c680: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c690: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c6a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c6b0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c6c0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c6d0: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c6e0: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c6f0: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c700: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c710: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c720: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c730: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c740: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c750: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c760: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c770: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c780: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c790: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c7a0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c7b0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c7c0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c7d0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c7e0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c7f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c800: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c810: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c820: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c830: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c840: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c850: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c860: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c870: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c880: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c890: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c8a0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c8b0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c8c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c8d0: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c8e0: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c8f0: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c900: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c910: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c920: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c930: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c940: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c950: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c960: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c970: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
c980: 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  7]+cbrk-iCellFir
c990: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
c9a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c9b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c9c0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
c9d0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
c9e0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
c9f0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ca00: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
ca10: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
ca20: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
ca30: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
ca40: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
ca50: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
ca60: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
ca70: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ca80: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ca90: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
caa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cab0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
cac0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
cad0: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
cae0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
caf0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
cb00: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
cb10: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
cb20: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
cb30: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
cb40: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
cb50: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
cb60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
cb70: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
cb80: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
cb90: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
cba0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
cbb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
cbc0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
cbd0: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
cbe0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
cbf0: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
cc00: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
cc10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
cc20: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
cc30: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
cc40: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
cc50: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
cc60: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
cc70: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
cc80: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
cc90: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
cca0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
ccb0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
ccc0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
ccd0: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
cce0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
ccf0: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
cd00: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
cd10: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
cd20: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
cd30: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
cd40: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
cd50: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
cd60: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
cd70: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
cd80: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
cd90: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
cda0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
cdb0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
cdc0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
cdd0: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
cde0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  ableSize;.  int 
cdf0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
ce00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
ce10: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20  free slot */..  
ce20: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
ce30: 20 20 77 68 69 6c 65 28 20 70 63 3c 3d 75 73 61    while( pc<=usa
ce40: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
ce50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce60: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
ce70: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
ce80: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
ce90: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
cea0: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
ceb0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
cec0: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
ced0: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
cee0: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
cef0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
cf00: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
cf10: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
cf20: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
cf30: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
cf40: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
cf50: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
cf60: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
cf70: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cf80: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  3 );.      if( s
cf90: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
cfa0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
cfb0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
cfc0: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
cfd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
cfe0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
cff0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
d000: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d010: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
d020: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
d030: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
d040: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
d050: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
d060: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
d070: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
d080: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
d090: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
d0a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d0b0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
d0c0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
d0d0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
d0e0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
d0f0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
d100: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
d110: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
d120: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
d130: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
d140: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
d150: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
d160: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
d170: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d180: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
d190: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
d1a0: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
d1b0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
d1c0: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
d1d0: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
d1e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
d1f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
d200: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
d210: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
d220: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d230: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
d240: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
d250: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
d260: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
d270: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  &aData[pc]);.   
d280: 20 69 66 28 20 70 63 3c 69 41 64 64 72 2b 73 69   if( pc<iAddr+si
d290: 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ze ) break;.  }.
d2a0: 20 20 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20    if( pc ){.    
d2b0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
d2c0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b  RRUPT_PAGE(pPg);
d2d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
d2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d2f0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d300: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d310: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d320: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d330: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d340: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d350: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d360: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d370: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d380: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d390: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d3a0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d3b0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d3c0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d3d0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d3e0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d3f0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d400: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d410: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d420: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d430: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d440: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d450: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d460: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d470: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d480: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d490: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d4a0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d4b0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d4c0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d4d0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d4e0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d4f0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d500: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d510: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d520: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d530: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d540: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d550: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d560: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d580: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d590: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d5a0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d5b0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d5c0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d5d0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d5e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d5f0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d600: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d610: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d620: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d630: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d640: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d650: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d670: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d680: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d690: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d6a0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d6c0: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d6d0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d6f0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d700: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d710: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d720: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
d730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
d750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
d760: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d770: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
d780: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d790: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d7a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d7b0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
d7c0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
d7d0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
d7e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d7f0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
d800: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d810: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
d820: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
d830: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
d840: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
d850: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
d860: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d870: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
d880: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
d890: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
d8a0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
d8b0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d8c0: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
d8d0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
d8e0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
d8f0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
d900: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
d910: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
d920: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d930: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d940: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d950: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d960: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d970: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d980: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d990: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d9a0: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d9b0: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d9c0: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d9d0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d9e0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d9f0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
da00: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
da10: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
da20: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
da30: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
da40: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
da50: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
da60: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
da70: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
da80: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
da90: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
daa0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
dab0: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
dac0: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
dad0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
dae0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
daf0: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
db00: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
db10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
db20: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
db30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
db40: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
db50: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
db60: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
db70: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
db80: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
db90: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
dba0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
dbb0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
dbc0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
dbd0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
dbe0: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
dbf0: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
dc00: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
dc10: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
dc20: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
dc30: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
dc40: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
dc50: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
dc60: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
dc70: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
dc80: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
dc90: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
dca0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
dcb0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
dcc0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
dcd0: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
dce0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
dcf0: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
dd00: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
dd10: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
dd20: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
dd30: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
dd40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dd50: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
dd60: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
dd70: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
dd80: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
dd90: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
dda0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
ddb0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
ddc0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
ddd0: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
dde0: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
ddf0: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
de00: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
de10: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
de20: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
de30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
de40: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
de50: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
de60: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
de70: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
de80: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
de90: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
dea0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
deb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
dec0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ded0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
dee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
def0: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
df00: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
df10: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
df20: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
df30: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
df40: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
df50: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
df60: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
df70: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
df80: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
df90: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
dfa0: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
dfb0: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
dfc0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
dfd0: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
dfe0: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
dff0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
e000: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
e010: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
e020: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
e030: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
e040: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
e050: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
e060: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
e070: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e080: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
e090: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
e0a0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
e0b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e0c0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
e0d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e0e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e0f0: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
e100: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
e110: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
e120: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
e130: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
e140: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
e150: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
e160: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
e170: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
e180: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
e190: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
e1a0: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
e1b0: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
e1c0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
e1d0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
e1e0: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
e1f0: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
e200: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
e210: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
e220: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
e230: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
e240: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
e250: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
e260: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
e270: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
e280: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
e290: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
e2a0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
e2b0: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
e2c0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
e2d0: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
e2e0: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
e2f0: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
e300: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
e310: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
e320: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
e330: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
e340: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
e350: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
e360: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
e370: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e3a0: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
e3b0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
e3c0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
e3f0: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
e400: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e430: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
e440: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
e450: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
e480: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
e490: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
e4a0: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
e4d0: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
e4e0: 75 31 36 20 78 3b 20 20 20 20 20 20 20 20 20 20  u16 x;          
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e510: 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
e520: 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20 69 45  area */.  u32 iE
e530: 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53  nd = iStart + iS
e540: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
e550: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
e560: 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75  st the iStart bu
e570: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
e580: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
e590: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
e5a0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  /* Page content 
e5b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e5c0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
e5d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e5e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
e5f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e600: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
e610: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61  RRUPT_DB || iSta
e620: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
e630: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
e640: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
e650: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
e660: 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50  DB || iEnd <= pP
e670: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e680: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
e690: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e6a0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e6b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e6c0: 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b  ert( iSize>=4 );
e6d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
e6e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
e6f0: 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
e700: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
e710: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20  ableSize-4 );.. 
e720: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e730: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e740: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e750: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e760: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e770: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e780: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e790: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e7a0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e7b0: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e7c0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e7d0: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e7e0: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e7f0: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e800: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e810: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e820: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e830: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e840: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e850: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e860: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e870: 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20  r]))<iStart ){. 
e880: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
e890: 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20  k<iPtr+4 ){.    
e8a0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e8b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e8c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e8d0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e8e0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
e8f0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e900: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e910: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50   if( iFreeBlk>pP
e920: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e930: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
e940: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e950: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e960: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
e970: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
e980: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
e990: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
e9a0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
e9b0: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
e9c0: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
e9d0: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
e9e0: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
e9f0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
ea00: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
ea10: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
ea20: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
ea30: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
ea40: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
ea50: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
ea60: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
ea70: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
ea80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
ea90: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
eaa0: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
eab0: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
eac0: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
ead0: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
eae0: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
eaf0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eb00: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
eb10: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
eb20: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
eb30: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
eb40: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e        if( iEnd >
eb50: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
eb60: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
eb70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eb80: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
eb90: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
eba0: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
ebb0: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
ebc0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
ebd0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
ebe0: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
ebf0: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
ec00: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
ec10: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
ec20: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
ec30: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
ec40: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
ec50: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
ec60: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
ec70: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
ec80: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
ec90: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
eca0: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
ecb0: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
ecc0: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
ecd0: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
ece0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
ecf0: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
ed00: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
ed10: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
ed20: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
ed30: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
ed40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ed50: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
ed60: 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72    nFrag += iStar
ed70: 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20  t - iPtrEnd;.   
ed80: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
ed90: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
eda0: 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b    iStart = iPtr;
edb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
edc0: 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74     if( nFrag>dat
edd0: 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72  a[hdr+7] ) retur
ede0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
edf0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ee00: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
ee10: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20   nFrag;.  }.  x 
ee20: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ee30: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20  [hdr+5]);.  if( 
ee40: 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20  iStart<=x ){.   
ee50: 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65   /* The new free
ee60: 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20  block is at the 
ee70: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
ee80: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ee90: 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75  ea,.    ** so ju
eea0: 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65  st extend the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eec0: 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61  rather than crea
eed0: 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  te another.    *
eee0: 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79  * freelist entry
eef0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61   */.    if( iSta
ef00: 72 74 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64  rt<x || iPtr!=hd
ef10: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
ef20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
ef30: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 75 74  (pPage);.    put
ef40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ef50: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
ef60: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ef70: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
ef80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ef90: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
efa0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
efb0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
efc0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
efd0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
efe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
eff0: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
f000: 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
f010: 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  RE ){.    /* Ove
f020: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
f030: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
f040: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
f050: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
f060: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
f070: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
f080: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
f090: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
f0a0: 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
f0b0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
f0c0: 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32 62 79 74  eBlk);.  put2byt
f0d0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
f0e0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 70 50 61  ], iSize);.  pPa
f0f0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
f100: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
f110: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f120: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
f130: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
f140: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
f150: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
f160: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
f170: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
f180: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
f190: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
f1a0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
f1b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
f1c0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
f1d0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
f1e0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
f1f0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
f200: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
f210: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
f220: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
f230: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f240: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
f250: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
f260: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f270: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
f280: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f290: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
f2a0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
f2b0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
f2c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
f2d0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
f2e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
f2f0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
f300: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
f310: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f320: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
f330: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
f340: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
f350: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f360: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f370: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f380: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
f390: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
f3a0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
f3b0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
f3c0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
f3d0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
f3e0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
f3f0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
f400: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
f410: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
f420: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
f430: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
f440: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
f450: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f460: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
f470: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31  ENCE-OF: R-07291
f480: 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f  -35328 A value o
f490: 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73  f 5 (0x05) means
f4a0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
f4b0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
f4c0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
f4d0: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f4e0: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
f4f0: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
f500: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f510: 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39  E-OF: R-26900-09
f520: 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  176 A value of 1
f530: 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74  3 (0x0d) means t
f540: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
f550: 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62   ** leaf table b
f560: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f570: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f580: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
f590: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  KEY|PTF_LEAF)==1
f5a0: 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  3 );.    pPage->
f5b0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
f5c0: 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
f5d0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  ){.      pPage->
f5e0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a  intKeyLeaf = 1;.
f5f0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
f600: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f610: 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20  arseCellPtr;.   
f620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
f630: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f640: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
f650: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f660: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
f670: 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  ad;.      pPage-
f680: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f690: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
f6a0: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a  oPayload;.    }.
f6b0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f6c0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
f6d0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
f6e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f6f0: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
f700: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
f710: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
f720: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f730: 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20  : R-43316-37308 
f740: 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78  A value of 2 (0x
f750: 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  02) means the pa
f760: 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
f770: 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62  interior index b
f780: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f790: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f7a0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
f7b0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f7c0: 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32  OF: R-59615-4282
f7d0: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  8 A value of 10 
f7e0: 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65  (0x0a) means the
f7f0: 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
f800: 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74  * leaf index b-t
f810: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
f820: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
f830: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
f840: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
f850: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
f860: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f870: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
f880: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f890: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f8a0: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
f8b0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
f8c0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
f8d0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
f8e0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
f8f0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
f900: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f910: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
f920: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
f930: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
f940: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
f950: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
f960: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f970: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f980: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
f990: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
f9a0: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
f9b0: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
f9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f9d0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
f9e0: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
f9f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
fa00: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
fa10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
fa20: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
fa30: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
fa40: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
fa50: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
fa60: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
fa70: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
fa80: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
fa90: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
faa0: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
fab0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
fac0: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
fad0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
fae0: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
faf0: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
fb00: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
fb10: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
fb20: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
fb30: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
fb40: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
fb50: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70  *pPage){.  int p
fb60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
fb70: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
fb80: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
fb90: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
fba0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
fbb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
fbc0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
fbd0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
fbe0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
fbf0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
fc00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
fc10: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
fc20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
fc30: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
fc40: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ure */.  int usa
fc50: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
fc60: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
fc70: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
fc80: 67 65 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c  ge */.  u16 cell
fc90: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
fca0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
fcb0: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
fcc0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
fcd0: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
fce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fcf0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
fd00: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
fd10: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
fd20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
fd30: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
fd40: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
fd50: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
fd60: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
fd70: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
fd80: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
fd90: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
fda0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
fdb0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
fdc0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
fdd0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
fde0: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
fdf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
fe00: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
fe10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fe20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
fe30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
fe40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fe50: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
fe60: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
fe70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fe80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fe90: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
fea0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
feb0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
fec0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
fed0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
fee0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
fef0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ff00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ff10: 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20  isInit==0 );..  
ff20: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ff30: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
ff40: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
ff50: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
ff60: 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  a;.  /* EVIDENCE
ff70: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
ff80: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
ff90: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
ffa0: 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a   indicating.  **
ffb0: 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
ffc0: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20   type. */.  if( 
ffd0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
ffe0: 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b  e, data[hdr]) ){
fff0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10000 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10010 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
10020 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10030 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10040 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10050 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10060 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
10070 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
10080 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
10090 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61 62  flow = 0;.  usab
100a0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
100b0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
100c0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
100d0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
100e0 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
100f0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50  ildPtrSize;.  pP
10100 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10110 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
10120 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
10130 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
10140 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61 67  lOffset];.  pPag
10150 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
10160 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
10170 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20  dPtrSize];.  /* 
10180 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10190 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
101a0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
101b0 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
101c0 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
101d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
101e0 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
101f0 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
10200 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
10210 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
10220 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
10230 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
10240 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
10250 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  +5]);.  /* EVIDE
10260 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
10270 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
10280 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10290 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
102a0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
102b0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
102c0 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
102d0 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
102e0 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
102f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
10300 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
10310 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
10320 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
10330 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
10340 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10350 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
10360 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10370 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
10380 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  }.  testcase( pP
10390 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
103a0 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a  ELL(pBt) );.  /*
103b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
103c0 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
103d0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
103e0 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
103f0 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
10400 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
10410 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
10420 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
10430 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
10440 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
10450 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
10460 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
10470 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
10480 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74  nus the.  ** byt
10490 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
104a0 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  pace. */.  asser
104b0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
104c0 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
104d0 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
104e0 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61  DB );..  /* A ma
104f0 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
10500 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
10510 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
10520 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  t the end.  ** o
10530 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
10540 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
10550 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
10560 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
10570 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
10580 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
10590 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70  l extends.  ** p
105a0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
105b0 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
105c0 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
105d0 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
105e0 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
105f0 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
10600 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
10610 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
10620 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  ge->nCell;.  iCe
10630 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
10640 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 70  ize - 4;.  if( p
10650 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
10660 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
10670 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  k ){.    int i; 
10680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10690 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
106a0 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
106b0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  */.    int sz;  
106c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
106d0 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
106e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
106f0 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
10700 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  -;.    for(i=0; 
10710 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
10720 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  i++){.      pc =
10730 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
10740 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
10750 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74  t+i*2]);.      t
10760 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
10770 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
10780 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
10790 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
107a0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
107b0 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
107c0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ast ){.        r
107d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
107e0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
107f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10800 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
10810 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
10820 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74  ta[pc]);.      t
10830 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
10840 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
10850 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
10860 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
10870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10880 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10890 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
108a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
108b0 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
108c0 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a  lLast++;.  }  ..
108d0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
108e0 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
108f0 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  e on the page.  
10900 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10910 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10920 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10930 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
10940 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  ives the.  ** st
10950 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
10960 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
10970 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
10980 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
10990 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  no.  ** freebloc
109a0 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  ks. */.  pc = ge
109b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
109c0 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
109d0 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
109e0 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
109f0 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10a00 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10a10 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20  .  if( pc>0 ){. 
10a20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73 69 7a     u32 next, siz
10a30 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  e;.    if( pc<iC
10a40 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
10a50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10a60 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
10a70 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
10a80 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10a90 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ere will.      *
10aa0 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
10ab0 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
10ac0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
10ad0 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
10ae0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10af0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10b00 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20 20 20  AGE(pPage); .   
10b10 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20   }.    while( 1 
10b20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  ){.      if( pc>
10b30 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10b40 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
10b50 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
10b60 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
10b70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10b80 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10b90 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
10ba0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
10bb0 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
10bc0 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
10bd0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10be0 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  +2]);.      nFre
10bf0 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10c00 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
10c10 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
10c20 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  eak;.      pc = 
10c30 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
10c40 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
10c50 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b      /* Freeblock
10c60 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
10c70 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
10c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10c90 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10ca0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
10cb0 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67  ( pc+size>(unsig
10cc0 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69  ned int)usableSi
10cd0 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  ze ){.      /* L
10ce0 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78  ast freeblock ex
10cf0 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20  tends past page 
10d00 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  end */.      ret
10d10 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10d20 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10d30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10d40 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
10d50 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
10d60 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
10d70 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10d80 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c  .  ** of the cel
10d90 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
10da0 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
10db0 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
10dc0 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c  hin.  ** the cel
10dd0 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
10de0 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
10df0 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
10e00 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  le-size.  ** of 
10e10 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
10e20 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
10e30 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
10e40 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20  check also.  ** 
10e50 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
10e60 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
10e70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10e80 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10e90 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63  t.  ** area, acc
10ea0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10eb0 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10ec0 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10ed0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
10ee0 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
10ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f00 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10f10 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Page);.  }.  pPa
10f20 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f30 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
10f40 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  irst);.  pPage->
10f50 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
10f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10f70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
10f80 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
10f90 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
10fa0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
10fb0 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
10fc0 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
10fd0 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
10fe0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
10ff0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
11000 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
11010 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
11020 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11030 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
11040 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
11050 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
11060 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
11070 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11080 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
11090 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
110a0 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
110b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
110c0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
110d0 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
110e0 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
110f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11100 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11110 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
11120 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11130 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
11140 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
11150 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11160 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11170 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11180 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
11190 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
111a0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
111b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
111c0 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
111d0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
111e0 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
111f0 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
11200 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
11210 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
11220 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
11230 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
11240 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
11250 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
11260 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
11270 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
11280 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
11290 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
112a0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
112b0 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
112c0 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
112d0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
112e0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
112f0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
11300 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
11310 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
11320 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
11330 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
11340 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
11350 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
11360 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
11370 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
11380 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
11390 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
113a0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
113b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
113c0 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
113d0 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
113e0 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
113f0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
11400 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
11410 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
11420 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
11430 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
11440 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
11450 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
11460 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
11470 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
11480 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
11490 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
114a0 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
114b0 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
114c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
114d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
114e0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
114f0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11500 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11510 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
11520 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
11530 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
11540 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11550 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
11560 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
11570 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
11580 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
11590 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
115a0 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
115b0 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
115c0 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
115d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
115e0 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
115f0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11600 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
11610 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
11620 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11630 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
11640 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
11650 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
11660 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
11670 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
11680 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
11690 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
116a0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
116b0 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
116c0 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
116d0 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
116e0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
116f0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
11700 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
11710 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
11720 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
11730 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
11740 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
11750 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
11760 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
11770 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
11780 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
11790 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
117a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
117b0 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
117c0 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
117d0 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
117e0 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
117f0 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
11800 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
11810 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
11820 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
11830 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11840 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
11850 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
11860 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
11870 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
11880 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11890 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
118a0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
118b0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
118c0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
118d0 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
118e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
118f0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11900 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11910 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11920 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
11930 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
11940 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
11950 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
11960 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
11970 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
11980 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
11990 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
119a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
119b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
119c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
119d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
119e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
119f0 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
11a00 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
11a10 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
11a20 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
11a30 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
11a40 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11a50 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
11a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11a70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
11a80 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
11a90 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
11aa0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
11ab0 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
11ac0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
11ad0 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
11ae0 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
11af0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
11b00 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
11b10 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
11b20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
11b30 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
11b40 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
11b50 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
11b60 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
11b70 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11b90 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11ba0 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
11bb0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
11bc0 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
11bd0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
11be0 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
11bf0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
11c00 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11c10 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
11c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11c30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c40 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11c50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11c60 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
11c70 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
11c80 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
11c90 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
11ca0 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
11cb0 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
11cc0 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
11cd0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
11ce0 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
11cf0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
11d00 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
11d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
11d20 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
11d30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
11d40 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
11d50 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
11d60 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
11d70 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
11d80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
11d90 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11da0 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
11db0 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
11dc0 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
11dd0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
11de0 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
11df0 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
11e00 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
11e10 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
11e20 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
11e30 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11e40 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
11e50 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
11e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
11e70 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
11e80 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
11e90 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
11ea0 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
11eb0 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
11ec0 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
11ed0 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
11ee0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
11ef0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11f00 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
11f10 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
11f20 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
11f30 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
11f40 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
11f50 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
11f60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
11f70 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
11f80 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fa0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
11fb0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
11fc0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
11fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11fe0 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
11ff0 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12000 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12020 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12030 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
12040 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12060 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
12070 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
12080 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
12090 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
120a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
120b0 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
120c0 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
120d0 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
120e0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
120f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12100 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12110 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12120 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12130 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
12140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
12150 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
12160 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
12170 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
12180 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
12190 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
121a0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
121b0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
121c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
121d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
121e0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
121f0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
12200 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12210 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12220 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12230 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12240 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12250 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
12260 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12270 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
12280 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
12290 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
122a0 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
122b0 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
122c0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
122d0 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
122e0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
122f0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
12300 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
12310 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
12320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
12340 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
12350 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
12360 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12370 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
12380 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
12390 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
123a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
123b0 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
123c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
123d0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
123e0 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
123f0 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
12400 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
12410 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
12420 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
12430 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
12440 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
12450 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
12460 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
12470 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
12480 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
12490 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
124a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
124b0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
124c0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
124d0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
124e0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
124f0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
12500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12510 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
12520 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
12530 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75   pCur ){.    pCu
12540 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
12550 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
12560 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
12570 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74  >iPage];.  }.  t
12580 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
12590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
125a0 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
125b0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
125c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
125d0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
125e0 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
125f0 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
12600 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
12610 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
12620 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a  reeGetPage..**.*
12630 2a 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65  * Page1 is a spe
12640 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75  cial case and mu
12650 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75  st be released u
12660 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65  sing releasePage
12670 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  One()..*/.static
12680 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
12690 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
126a0 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
126b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
126c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
126d0 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
126e0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
126f0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
12700 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12710 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
12720 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
12730 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
12740 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
12750 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
12760 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
12770 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12780 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12790 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
127a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
127b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
127c0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
127d0 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
127e0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
127f0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12800 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
12810 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
12820 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
12830 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
12840 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50  easePageOne(MemP
12850 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12860 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
12870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12880 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
12890 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
128a0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
128b0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
128c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
128d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
128e0 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
128f0 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
12900 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
12910 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12920 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
12930 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
12940 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
12950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12960 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
12970 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
12980 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
12990 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ne(pPage->pDbPag
129a0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
129b0 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
129c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
129d0 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
129e0 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
129f0 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
12a00 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
12a10 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
12a20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
12a30 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
12a40 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
12a50 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
12a60 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
12a70 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
12a80 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
12a90 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
12aa0 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
12ab0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
12ac0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
12ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12af0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
12b00 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
12b10 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
12b20 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
12b30 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12b40 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
12b50 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12b60 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12b70 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12b80 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12b90 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12ba0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12bb0 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
12bc0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12bd0 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
12be0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c00 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12c10 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
12c20 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
12c30 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
12c40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12c50 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
12c60 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
12c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12c80 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
12c90 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
12ca0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
12cc0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
12cd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12ce0 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
12cf0 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
12d00 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
12d10 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
12d20 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
12d30 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
12d40 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
12d50 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
12d60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
12d70 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
12d80 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
12d90 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
12da0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12db0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12dc0 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
12dd0 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
12de0 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
12df0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12e00 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
12e10 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
12e20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
12e30 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
12e40 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
12e50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12e60 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
12e70 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
12e80 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
12e90 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
12ea0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12eb0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
12ec0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12ed0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
12ee0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12ef0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12f00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12f10 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12f20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
12f30 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12f40 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
12f50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
12f60 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
12f70 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
12f80 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
12f90 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
12fa0 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
12fb0 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
12fc0 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
12fd0 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
12fe0 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
12ff0 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
13000 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
13010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
13020 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
13030 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
13040 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
13050 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
13060 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
13070 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
13080 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
13090 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
130a0 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
130b0 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
130c0 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
130d0 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
130e0 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
130f0 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
13100 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
13110 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
13120 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13130 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
13140 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13150 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13160 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
13170 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
13180 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
13190 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
131a0 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
131b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
131c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
131d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
131e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
131f0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
13200 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
13210 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  dler,.          
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
13240 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
13250 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ager));.}../*.**
13260 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
13270 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
13280 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
13290 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
132a0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
132b0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
132c0 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
132d0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
132e0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
132f0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13300 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
13310 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
13320 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
13330 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
13340 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
13350 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
13360 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
13370 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
13380 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
13390 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
133a0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
133b0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
133c0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
133d0 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
133e0 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
133f0 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
13400 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
13410 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
13420 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
13430 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
13440 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
13450 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
13460 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
13470 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
13480 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
13490 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
134a0 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
134b0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
134c0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
134d0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
134e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
134f0 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
13500 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
13510 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
13520 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
13530 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
13540 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
13550 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
13560 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
13570 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
13580 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
13590 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
135a0 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
135b0 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
135c0 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
135d0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
135e0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
135f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
13600 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
13610 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
13620 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
13630 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13640 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
13650 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
13660 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
13670 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
13680 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
13690 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
136a0 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
136b0 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
136c0 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
136d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
136e0 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
136f0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
13700 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
13710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
13720 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
13730 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
13740 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
13750 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
13760 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
13770 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
13780 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
13790 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
137a0 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
137b0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
137c0 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
137e0 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
137f0 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
13800 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
13810 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
13820 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
13830 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
13840 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
13850 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13860 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
13870 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
13880 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
13890 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
138a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
138b0 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
138c0 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
138d0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
138e0 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
138f0 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
13900 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
13910 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
13920 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
13930 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
13940 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
13950 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
13960 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
13970 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
13980 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
13990 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
139a0 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
139b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
139c0 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
139d0 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
139e0 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
139f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
13a00 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13a10 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
13a20 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
13a30 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
13a40 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
13a50 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
13a60 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
13a70 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13a90 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
13aa0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
13ab0 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13ad0 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
13ae0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
13af0 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
13b00 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
13b10 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
13b20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13b30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13b40 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13b50 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
13b60 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
13b70 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
13b80 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
13b90 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
13ba0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
13bb0 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
13bc0 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
13bd0 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
13be0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
13bf0 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
13c00 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
13c10 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
13c20 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
13c30 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
13c40 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
13c50 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
13c60 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
13c70 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
13c80 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
13c90 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
13ca0 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
13cb0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
13cc0 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
13cd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13ce0 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
13cf0 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
13d00 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
13d10 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
13d20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13d30 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
13d40 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
13d50 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
13d60 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
13d70 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
13d80 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13d90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13da0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
13db0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13dc0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
13dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13de0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
13df0 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
13e00 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
13e10 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
13e20 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
13e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13e40 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
13e50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13e60 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
13e70 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
13e80 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
13e90 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
13ea0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
13eb0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
13ec0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13ed0 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
13ee0 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
13ef0 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
13f00 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
13f10 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
13f20 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
13f30 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
13f40 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13f50 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
13f60 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
13f70 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
13f80 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
13f90 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
13fa0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
13fb0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
13fc0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
13fd0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
13fe0 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
13ff0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
14000 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
14010 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14020 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
14030 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
14040 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
14050 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
14060 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
14070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14080 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
14090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
140a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
140b0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
140c0 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
140d0 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
140e0 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
140f0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
14100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14120 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
14130 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
14170 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14180 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
14190 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
141a0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
141b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
141c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
141d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
141e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
141f0 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
14200 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
14210 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
14220 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14230 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14240 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
14250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14260 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
14270 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
14280 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
14290 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
142a0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
142b0 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
142c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
142d0 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
142e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
142f0 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
14300 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14310 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
14320 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
14330 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
14340 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
14350 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
14360 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
14370 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
14380 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
14390 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143b0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
143c0 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
143d0 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
143e0 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
143f0 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
14400 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
14410 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
14420 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
14430 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
14440 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
14450 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
14460 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
14470 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
14480 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14490 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
144a0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
144c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
144d0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
144e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
144f0 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14500 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
14510 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14520 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14540 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
14550 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14570 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
14580 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
14590 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
145a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
145b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
145c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
145d0 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
145e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
145f0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
14600 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
14610 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14620 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
14630 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
14640 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
14650 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
14660 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
14670 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
14680 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
14690 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
146a0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
146b0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
146c0 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
146d0 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
146e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
146f0 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
14700 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
14710 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
14720 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
14730 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
14740 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
14750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14760 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
14770 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
14780 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
14790 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
147a0 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
147b0 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
147c0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
147d0 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
147e0 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
147f0 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
14800 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
14810 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
14820 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
14830 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
14840 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14850 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
14860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14870 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
14880 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14890 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
148a0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
148b0 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
148c0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
148d0 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
148e0 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
148f0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
14900 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
14910 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
14920 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14930 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
14940 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14950 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
14960 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14970 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
14980 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
14990 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
149b0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20  izeof(MemPage), 
149c0 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
149d0 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
149e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
149f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14a00 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
14a10 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
14a20 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
14a30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14a40 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
14a50 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
14a60 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
14a70 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
14a80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14aa0 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
14ab0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
14ac0 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
14ad0 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
14ae0 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
14af0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14b00 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  erSetBusyHandler
14b10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
14b20 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
14b30 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
14b40 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
14b50 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
14b60 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
14b70 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
14b80 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
14b90 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
14ba0 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
14bb0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
14bc0 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65  EAD_ONLY;.#if de
14bd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43  fined(SQLITE_SEC
14be0 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
14bf0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14c00 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14c10 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  TE;.#elif define
14c20 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45  d(SQLITE_FAST_SE
14c30 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
14c40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14c50 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b  = BTS_OVERWRITE;
14c60 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
14c70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
14c80 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
14c90 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
14ca0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
14cb0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
14cc0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
14cd0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
14ce0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
14cf0 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
14d00 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
14d10 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
14d20 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
14d30 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
14d40 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
14d50 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
14d60 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14d70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
14d80 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
14d90 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
14da0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
14db0 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
14dc0 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
14dd0 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
14de0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14df0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
14e00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14e10 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
14e20 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
14e30 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
14e40 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
14e50 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
14e60 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
14e70 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
14e80 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
14e90 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
14ea0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
14eb0 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
14ec0 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
14ed0 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
14ee0 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
14ef0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
14f00 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
14f10 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
14f20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
14f30 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
14f40 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
14f50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
14f60 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
14f70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
14f80 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
14f90 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
14fa0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
14fb0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
14fc0 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
14fd0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
14fe0 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
14ff0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
15000 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
15010 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15020 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
15030 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
15040 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
15050 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
15060 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
15070 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
15080 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
15090 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
150a0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
150b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
150c0 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
150d0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
150e0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
150f0 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
15100 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15110 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
15120 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
15130 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
15140 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
15150 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
15160 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
15170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
15180 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
15190 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
151a0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
151b0 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
151c0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
151d0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
151e0 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
151f0 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
15200 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
15210 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
15220 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
15230 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
15240 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
15250 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
15260 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
15270 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15280 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
15290 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
152a0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
152b0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
152c0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
152d0 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
152e0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
152f0 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
15300 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15310 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15320 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15330 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
15340 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
15350 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
15360 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
15370 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
15380 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
15390 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65   */.    pBt->nRe
153a0 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  f = 1;.    if( p
153b0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
153c0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
153d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
153e0 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
153f0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
15400 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
15410 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
15420 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15430 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
15440 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
15450 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
15460 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15470 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
15480 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
15490 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
154a0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
154b0 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
154c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
154d0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
154e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
154f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
15500 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
15510 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
15520 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15530 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15540 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
15550 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
15560 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
15570 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15580 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
15590 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
155a0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
155b0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
155c0 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
155d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
155e0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
155f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
15600 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15610 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15620 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
15630 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15640 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
15650 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
15660 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
15670 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
15680 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
15690 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
156a0 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
156b0 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
156c0 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
156d0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
156e0 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
156f0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
15700 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
15710 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
15720 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
15730 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
15740 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
15750 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
15760 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
15770 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
15780 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
15790 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
157a0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
157b0 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
157c0 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
157d0 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72         if( (uptr
157e0 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53  )p->pBt<(uptr)pS
157f0 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
15800 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15810 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
15820 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
15830 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
15840 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
15850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15860 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
15870 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53  Next && (uptr)pS
15880 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28  ib->pNext->pBt<(
15890 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20  uptr)p->pBt ){. 
158a0 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
158b0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
158c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
158d0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
158e0 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
158f0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
15900 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
15910 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
15920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
15930 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15940 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
15950 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
15960 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
15970 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
15980 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
15990 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
159a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
159b0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
159c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
159d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
159e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
159f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15a00 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
15a10 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
15a20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15a30 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
15a40 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
15a50 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
15a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15a70 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b  te3_file *pFile;
15a80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
15a90 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
15aa0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
15ab0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
15ac0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
15ad0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
15ae0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
15af0 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
15b00 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
15b10 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
15b20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
15b30 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
15b40 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
15b50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
15b60 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
15b70 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
15b80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15b90 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
15ba0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
15bb0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
15bc0 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ZE);.    }..    
15bd0 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
15be0 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
15bf0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
15c00 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
15c10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
15c20 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
15c30 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46  (pFile, SQLITE_F
15c40 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a  CNTL_PDB, (void*
15c50 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20  )&pBt->db);.    
15c60 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
15c70 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
15c80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15c90 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
15ca0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
15cb0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15cc0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
15cd0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15ce0 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
15cf0 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43  BtreeConnectionC
15d00 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30  ount(*ppBtree)>0
15d10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
15d20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15d30 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15d40 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15d50 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15d60 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15d70 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15d80 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15d90 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
15da0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15db0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15dc0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
15dd0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
15de0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
15df0 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
15e00 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
15e10 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
15e20 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15e30 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15e40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15e50 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15e60 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15e70 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15e80 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
15e90 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
15ea0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
15eb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15ec0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
15ed0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
15ee0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
15ef0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15f00 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15f10 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
15f20 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15f30 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15f40 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15f50 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15f60 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15f70 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15f80 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15f90 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
15fa0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
15fb0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15fc0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
15fd0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
15fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15ff0 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
16000 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16010 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16020 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
16030 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
16040 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
16050 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
16060 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
16070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16080 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
16090 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
160a0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
160b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
160c0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
160d0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
160e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
160f0 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
16100 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
16110 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
16120 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
16130 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
16140 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
16150 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
16160 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
16170 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
16180 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
16190 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
161a0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
161b0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
161c0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
161d0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
161e0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
161f0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
16200 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
16210 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
16220 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
16230 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
16240 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16250 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
16260 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
16270 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
16280 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
16290 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
162a0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
162b0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
162c0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
162d0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
162e0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
162f0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
16300 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
16310 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
16320 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
16330 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
16340 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
16350 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
16360 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
16370 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
16380 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
16390 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
163a0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
163b0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
163c0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
163d0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
163e0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
163f0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
16400 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
16410 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
16420 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
16430 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
16440 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
16450 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
16460 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
16470 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
16480 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
16490 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
164a0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
164b0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
164c0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
164d0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
164e0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
164f0 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
16500 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
16510 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
16520 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
16530 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
16540 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
16550 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
16560 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
16570 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
16580 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
16590 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
165a0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
165b0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
165c0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
165d0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
165e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
165f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16600 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
16610 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
16620 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16630 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
16640 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16650 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
16660 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
16670 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
16680 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
16690 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
166a0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
166b0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
166c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
166d0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
166e0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
166f0 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
16700 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
16710 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
16720 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16730 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
16740 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
16750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16760 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
16770 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
16780 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
167a0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
167b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
167c0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
167d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
167e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
167f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16800 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16810 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
16820 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16830 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
16840 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
16850 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
16860 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
16870 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
16880 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
16890 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
168a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
168b0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
168c0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
168d0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
168e0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
168f0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
16900 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
16910 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
16920 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16930 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
16940 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
16950 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
16960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
16970 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
16980 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
16990 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
169a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
169b0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
169c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
169d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
169e0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
169f0 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
16a00 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
16a10 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
16a20 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16a30 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16a40 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16a50 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16a60 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16a70 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16a80 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
16a90 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
16aa0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
16ab0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
16ac0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
16ad0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
16ae0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
16af0 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
16b00 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
16b10 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
16b20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16b30 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16b40 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16b50 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16b60 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16b70 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16b80 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16b90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
16ba0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  >db);.    if( pB
16bb0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
16bc0 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
16bd0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
16be0 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
16bf0 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
16c00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c10 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
16c20 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
16c30 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
16c40 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
16c50 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16c60 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16c70 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
16c80 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
16c90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16ca0 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
16cb0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
16cc0 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
16cd0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
16ce0 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
16cf0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16d00 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
16d10 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16d20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16d30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16d40 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66   Change the "sof
16d50 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  t" limit on the 
16d60 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16d70 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
16d80 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f   Unused and unmo
16d90 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c  dified pages wil
16da0 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68  l be recycled wh
16db0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
16dc0 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65  .** pages in the
16dd0 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74   cache exceeds t
16de0 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20  his soft limit. 
16df0 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66   But the size of
16e00 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73   the.** cache is
16e10 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77   allowed to grow
16e20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
16e30 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f  s limit if it co
16e40 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20  ntains.** dirty 
16e50 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73  pages or pages s
16e60 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75  till in active u
16e70 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
16e80 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
16e90 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16ea0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
16eb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16ec0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
16ed0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16ee0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
16ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16f00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
16f10 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
16f20 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16f30 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
16f40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16f50 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16f60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16f70 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69   Change the "spi
16f80 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ll" limit on the
16f90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16fa0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
16fb0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
16fc0 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73  of pages exceeds
16fd0 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69   this limit duri
16fe0 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
16ff0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70  action,.** the p
17000 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d  ager might attem
17010 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61  pt to "spill" pa
17020 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ges to the journ
17030 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f  al early in.** o
17040 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
17050 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
17060 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
17070 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   is the current 
17080 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20  spill size.  If 
17090 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a  zero is passed.*
170a0 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
170b0 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  , no changes are
170c0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69   made to the spi
170d0 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c  ll size setting,
170e0 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50   so.** using mxP
170f0 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61  age of 0 is a wa
17100 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63  y to query the c
17110 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
17120 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17130 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69  3BtreeSetSpillSi
17140 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
17150 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
17160 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17170 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  Bt;.  int res;. 
17180 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17190 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
171a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
171b0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
171c0 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  (p);.  res = sql
171d0 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
171e0 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  lsize(pBt->pPage
171f0 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
17200 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17210 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  p);.  return res
17220 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
17230 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
17240 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17250 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
17260 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
17270 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
17280 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
17290 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
172a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
172b0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
172c0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
172d0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
172e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
172f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17310 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17330 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17340 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
17350 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
17360 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
17370 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17380 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17390 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
173a0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
173b0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
173c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
173d0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
173e0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
173f0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
17400 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
17410 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
17420 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
17430 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
17440 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
17450 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
17460 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
17470 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
17480 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
17490 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
174a0 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
174b0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
174c0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
174d0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
174e0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
174f0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
17500 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17510 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
17520 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
17530 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17540 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
17550 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
17560 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
17570 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
17580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
17590 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
175a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
175b0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
175c0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
175d0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
175e0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
175f0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
17600 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
17610 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
17620 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
17630 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
17640 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17650 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17660 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17670 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17680 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17690 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
176a0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
176b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
176c0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
176d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
176e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
176f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
17710 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
17720 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
17730 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
17740 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
17750 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
17760 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
17770 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
17780 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
17790 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
177a0 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
177b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
177c0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
177d0 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
177e0 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
177f0 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
17800 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
17810 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
17820 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
17830 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
17840 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
17850 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
17860 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
17870 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
17880 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
17890 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
178a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
178b0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
178c0 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
178d0 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
178e0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
178f0 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
17900 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
17910 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
17920 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
17930 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
17940 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
17950 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
17960 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
17970 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
17980 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
17990 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
179a0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
179b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
179c0 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
179d0 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
179e0 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
179f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
17a00 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
17a10 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
17a20 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
17a30 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
17a40 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
17a50 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
17a60 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
17a70 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
17a80 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
17a90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17aa0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17ab0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
17ac0 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
17ad0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
17ae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17af0 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
17b00 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
17b10 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
17b20 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17b30 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
17b40 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
17b50 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
17b60 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
17b70 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17b80 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
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 20 20 72 65 74 75 72 6e  e(p);.    return
17bb0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17bc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
17bd0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
17be0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
17bf0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
17c00 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
17c10 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17c20 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
17c30 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
17c40 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
17c50 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
17c60 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
17c70 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
17c80 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
17c90 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
17ca0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
17cb0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
17cc0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
17cd0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
17ce0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
17cf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
17d00 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
17d10 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
17d20 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17d30 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17d40 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
17d50 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
17d60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
17d70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
17d80 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
17d90 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
17da0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17db0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
17dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17dd0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17de0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17df0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
17e00 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
17e10 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
17e20 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
17e30 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
17e40 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
17e50 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
17e60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17e70 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
17e80 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17e90 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
17ea0 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
17eb0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
17ec0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17ed0 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
17ee0 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
17ef0 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
17f00 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
17f10 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
17f20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
17f30 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
17f40 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
17f50 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
17f60 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
17f70 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
17f80 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
17f90 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17fa0 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
17fb0 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
17fc0 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
17fd0 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
17fe0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
17ff0 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
18000 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
18010 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
18020 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
18030 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
18040 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
18050 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
18060 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18070 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18080 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
18090 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
180a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
180b0 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
180c0 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
180d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
180e0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
180f0 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
18100 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18110 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18120 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
18130 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
18140 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
18150 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
18160 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
18170 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
18180 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
18190 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
181a0 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
181b0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
181c0 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
181d0 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
181e0 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
181f0 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
18200 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
18210 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
18220 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
18230 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
18240 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
18250 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
18260 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
18270 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
18280 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
18290 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
182a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
182b0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
182c0 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
182d0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
182e0 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
182f0 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
18300 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
18310 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
18320 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18330 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18340 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
18350 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
18360 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
18370 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
18380 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
18390 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
183a0 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
183b0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
183c0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
183d0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
183e0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
183f0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18400 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
18410 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
18420 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
18430 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
18440 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18450 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18460 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
18470 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
18480 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
18490 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
184a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
184b0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
184c0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
184d0 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54  alues for the BT
184e0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
184f0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18500 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  E flags:.**.**  
18510 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20    newFlag==0    
18520 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55     Both BTS_SECU
18530 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
18540 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20  S_OVERWRITE are 
18550 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
18560 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42  wFlag==1       B
18570 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
18580 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45   set and BTS_OVE
18590 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65  RWRITE is cleare
185a0 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
185b0 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =2       BTS_SEC
185c0 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72  URE_DELETE clear
185d0 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  ed and BTS_OVERW
185e0 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20  RITE is set.**  
185f0 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20    newFlag==(-1) 
18600 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a     No changes.**
18610 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18620 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79   acts as a query
18630 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c   if newFlag is l
18640 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a  ess than zero.**
18650 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45  .** With BTS_OVE
18660 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65  RWRITE set, dele
18670 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f  ted content is o
18680 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65  verwritten by ze
18690 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65  ros, but.** free
186a0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
186b0 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  are not written 
186c0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
186d0 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70  base.  Thus in-p
186e0 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63  age.** deleted c
186f0 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65  ontent is cleare
18700 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20  d, but freelist 
18710 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
18720 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  is not..**.** Wi
18730 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
18740 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20  LETE, operation 
18750 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52  is like BTS_OVER
18760 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61  WRITE with the a
18770 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ddition.** that 
18780 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
18790 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
187a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
187b0 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69  tabase, increasi
187c0 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74  ng.** the amount
187d0 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f   of disk I/O..*/
187e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
187f0 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
18800 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
18810 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
18820 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
18830 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
18840 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18850 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52  assert( BTS_OVER
18860 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52  WRITE==BTS_SECUR
18870 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20  E_DELETE*2 );.  
18880 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54  assert( BTS_FAST
18890 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56  _SECURE==(BTS_OV
188a0 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55  ERWRITE|BTS_SECU
188b0 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20  RE_DELETE) );.  
188c0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
188d0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
188e0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46  sFlags &= ~BTS_F
188f0 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20  AST_SECURE;.    
18900 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18910 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
18920 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20  ELETE*newFlag;. 
18930 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74   }.  b = (p->pBt
18940 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18950 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54  _FAST_SECURE)/BT
18960 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
18970 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
18980 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
18990 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
189a0 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
189b0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
189c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
189d0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
189e0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
189f0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
18a00 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
18a10 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
18a20 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
18a30 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
18a40 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
18a50 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
18a60 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
18a70 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
18a80 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
18a90 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
18aa0 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
18ab0 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
18ac0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
18ad0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
18ae0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18af0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b10 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
18b20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18b30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
18b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18b50 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
18b60 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
18b70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18b80 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
18b90 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
18ba0 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
18bb0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
18bc0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
18bd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18be0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
18bf0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
18c00 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
18c10 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
18c20 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
18c30 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
18c40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
18c60 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
18c70 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
18c80 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
18c90 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
18ca0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
18cb0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
18cc0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18cd0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
18ce0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
18cf0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18d00 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
18d10 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18d20 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
18d30 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
18d40 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
18d50 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
18d60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18d70 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
18d80 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
18d90 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
18da0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
18db0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
18dc0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18dd0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
18de0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
18df0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
18e00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18e10 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18e30 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
18e40 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
18e50 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
18e60 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18e70 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
18e80 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
18e90 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
18ea0 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
18eb0 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
18ec0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
18ed0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
18ee0 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
18ef0 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
18f00 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
18f10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18f20 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
18f30 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18f40 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20  YNCHRONOUS \.   
18f50 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
18f60 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74  ITE_OMIT_WAL).st
18f70 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66  atic void setDef
18f80 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53  aultSyncFlag(BtS
18f90 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73  hared *pBt, u8 s
18fa0 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20  afety_level){.  
18fb0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
18fc0 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64  b *pDb;.  if( (d
18fd0 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
18fe0 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
18ff0 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
19000 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
19010 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
19020 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
19030 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63    if( pDb->bSync
19040 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Set==0 .     && 
19050 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
19060 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  l!=safety_level 
19070 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64  .     && pDb!=&d
19080 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29  b->aDb[1] .    )
19090 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66  {.      pDb->saf
190a0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65  ety_level = safe
190b0 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
190c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
190d0 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
190e0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
190f0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20  >safety_level | 
19100 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47  (db->flags & PAG
19110 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b  ER_FLAGS_MASK));
19120 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
19130 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44  se.# define setD
19140 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
19150 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  Bt,safety_level)
19160 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
19170 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
19180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
19190 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
191a0 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ed*);.../*.** Ge
191b0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
191c0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
191d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
191e0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
191f0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
19200 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
19210 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
19220 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
19230 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
19240 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
19250 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
19260 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
19270 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
19280 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
19290 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
192a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
192b0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
192c0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
192d0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
192e0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
192f0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
19300 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
19310 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
19320 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
19330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19340 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
19350 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
19360 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19370 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
19380 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19390 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50  file */.  u32 nP
193a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
193b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
193c0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
193d0 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65  e */.  u32 nPage
193e0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
193f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19400 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19410 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
19420 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
19430 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19440 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19450 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
19460 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
19470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19480 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
194a0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
194b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
194c0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
194d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
194e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
194f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
19500 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
19510 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
19520 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19530 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
19540 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
19550 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
19560 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
19570 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
19580 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
19590 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
195a0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
195b0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
195c0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
195d0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
195e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
195f0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
19600 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e  pPager, (int*)&n
19610 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
19620 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
19630 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
19640 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
19650 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19660 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
19670 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
19680 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d  .  }.  if( (pBt-
19690 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
196a0 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73  ITE_ResetDatabas
196b0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  e)!=0 ){.    nPa
196c0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ge = 0;.  }.  if
196d0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
196e0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
196f0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
19700 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
19710 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
19720 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19730 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
19740 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19750 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
19760 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
19770 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
19780 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
19790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
197a0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
197b0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
197c0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
197d0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
197e0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
197f0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
19800 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19810 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
19820 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19830 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
19840 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19850 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
19860 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
19870 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
19880 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
19890 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
198a0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
198b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
198c0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
198d0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
198e0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
198f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
19900 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
19910 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
19920 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
19930 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19940 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19950 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19960 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
19970 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
19980 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
19990 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
199a0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
199b0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
199c0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
199d0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
199e0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
199f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a00 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19a10 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19a20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19a30 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19a40 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19a50 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19a60 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19a70 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19a80 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19a90 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
19aa0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
19ab0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
19ac0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
19ad0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
19ae0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
19af0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
19b00 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19b10 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19b20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
19b30 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
19b40 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
19b50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
19b60 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
19b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19b80 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
19b90 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
19ba0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
19bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19bc0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
19bd0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19be0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19bf0 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19c00 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19c10 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
19c20 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
19c30 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
19c40 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
19c50 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
19c60 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19c70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19c80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
19c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
19ca0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19cc0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
19cd0 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
19ce0 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
19cf0 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a  ONOUS+1);.    }.
19d00 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
19d10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
19d20 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
19d30 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
19d40 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
19d50 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
19d60 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
19d70 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
19d80 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
19d90 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
19da0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19db0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
19dc0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
19dd0 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
19de0 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
19df0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
19e00 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
19e10 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
19e20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
19e30 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
19e40 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
19e50 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
19e60 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19e70 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
19e80 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19e90 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
19ea0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
19eb0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19ec0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19ed0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
19ee0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
19ef0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
19f00 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
19f10 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
19f20 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
19f30 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19f40 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
19f50 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
19f60 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
19f70 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19f80 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
19f90 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
19fa0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
19fb0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
19fc0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
19fd0 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
19fe0 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
19ff0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
1a000 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
1a010 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
1a020 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
1a030 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
1a040 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
1a050 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a060 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a070 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1a080 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1a090 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65  _FIXED;.    asse
1a0a0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
1a0b0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
1a0c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1a0d0 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
1a0e0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
1a0f0 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
1a100 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
1a110 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
1a120 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a130 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1a140 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
1a150 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
1a160 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
1a170 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
1a180 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
1a190 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
1a1a0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
1a1b0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
1a1c0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
1a1d0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1a1e0 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
1a1f0 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
1a200 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
1a210 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
1a220 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a230 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
1a240 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
1a250 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
1a260 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
1a270 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
1a280 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1a290 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
1a2a0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1a2b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a2c0 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
1a2d0 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
1a2e0 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
1a2f0 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
1a300 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
1a310 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
1a320 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
1a330 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
1a340 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
1a350 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1a360 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
1a370 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1a380 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
1a390 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
1a3a0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
1a3b0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
1a3c0 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
1a3d0 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
1a3e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1a3f0 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1a400 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
1a410 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
1a420 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
1a430 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a440 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
1a450 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
1a460 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a470 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
1a480 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
1a490 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1a4c0 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
1a4d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a4e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1a4f0 28 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c  ( sqlite3Writabl
1a500 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29  eSchema(pBt->db)
1a510 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
1a520 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
1a530 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1a540 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1a550 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a560 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1a570 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a580 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20  : R-28312-64704 
1a590 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61  However, the usa
1a5a0 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ble size is not 
1a5b0 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a  allowed to.    *
1a5c0 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  * be less than 4
1a5d0 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  80. In other wor
1a5e0 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ds, if the page 
1a5f0 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65  size is 512, the
1a600 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
1a610 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65  erved space size
1a620 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33   cannot exceed 3
1a630 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73  2. */.    if( us
1a640 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
1a650 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a660 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a670 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
1a680 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1a690 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
1a6a0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a6b0 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
1a6c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a6d0 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
1a6e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1a6f0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
1a700 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
1a710 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
1a720 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1a730 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
1a740 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
1a750 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
1a760 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
1a770 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
1a780 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
1a790 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
1a7a0 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
1a7b0 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
1a7c0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
1a7d0 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
1a7e0 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
1a7f0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
1a800 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
1a810 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
1a820 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
1a830 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
1a840 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
1a850 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
1a860 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
1a870 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
1a880 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
1a890 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
1a8a0 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
1a8b0 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
1a8c0 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
1a8d0 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
1a8e0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
1a8f0 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
1a900 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
1a910 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61  e pointer, a hea
1a920 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
1a930 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
1a940 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
1a950 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
1a960 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
1a970 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
1a980 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
1a990 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
1a9a0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
1a9b0 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1a9c0 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
1a9d0 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
1a9e0 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  inLocal = (u16)(
1a9f0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1aa00 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1aa10 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  );.  pBt->maxLea
1aa20 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  f = (u16)(pBt->u
1aa30 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b  sableSize - 35);
1aa40 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
1aa50 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1aa60 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1aa70 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28  255 - 23);.  if(
1aa80 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31   pBt->maxLocal>1
1aa90 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  27 ){.    pBt->m
1aaa0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
1aab0 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   127;.  }else{. 
1aac0 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1aad0 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42  Payload = (u8)pB
1aae0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d  t->maxLocal;.  }
1aaf0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1ab00 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
1ab10 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
1ab20 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
1ab30 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
1ab40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1ab50 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ab60 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
1ab70 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
1ab80 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1ab90 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1aba0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1abb0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1abc0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1abd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1abe0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1abf0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1ac00 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1ac10 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1ac20 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1ac30 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1ac40 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1ac50 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1ac60 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1ac70 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1ac80 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1ac90 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1aca0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1acb0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1acc0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1acd0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1ace0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1acf0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1ad00 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1ad10 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1ad20 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1ad30 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1ad40 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1ad50 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1ad60 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1ad70 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1ad80 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1ad90 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1ada0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1adb0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1adc0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1add0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1ade0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1adf0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1ae00 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1ae10 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1ae20 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1ae30 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1ae40 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1ae50 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1ae60 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1ae70 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1ae80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1ae90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1aea0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1aeb0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1aec0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1aed0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1aee0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1aef0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1af00 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1af10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1af20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1af30 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1af40 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1af50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1af60 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1af70 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1af80 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1af90 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1afa0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1afb0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1afc0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1afd0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1afe0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1aff0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1b000 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b010 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b020 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1b030 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1b040 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1b050 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1b060 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1b070 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1b080 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1b090 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b0a0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1b0b0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1b0c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b0d0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b0f0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1b100 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b110 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1b120 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1b130 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1b140 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1b150 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1b160 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b170 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
1b180 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
1b190 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
1b1a0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
1b1b0 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
1b1c0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
1b1d0 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
1b1e0 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
1b1f0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1b200 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1b210 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
1b220 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
1b230 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
1b240 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
1b250 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1b260 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b270 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1b280 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
1b290 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
1b2a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b2b0 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
1b2c0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
1b2d0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
1b2e0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
1b2f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b300 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
1b310 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1b320 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b330 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
1b340 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
1b350 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1b360 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
1b370 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
1b380 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
1b390 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
1b3a0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
1b3b0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
1b3c0 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1b3d0 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
1b3e0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
1b3f0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
1b400 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
1b410 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
1b420 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
1b430 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
1b440 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
1b450 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
1b460 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
1b470 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
1b480 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1b490 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
1b4a0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
1b4b0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
1b4c0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
1b4d0 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
1b4e0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
1b4f0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
1b500 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
1b510 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b520 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
1b530 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
1b540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b550 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
1b560 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
1b570 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
1b580 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
1b590 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
1b5a0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1b5b0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
1b5c0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b5d0 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
1b5e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1b5f0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1b600 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
1b610 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
1b620 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
1b630 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
1b640 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1b650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b660 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1b670 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1b680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b690 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
1b6a0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
1b6b0 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
1b6c0 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
1b6d0 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
1b6e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1b6f0 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
1b700 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1b710 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1b720 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1b730 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
1b740 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1b750 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b760 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
1b770 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1b780 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1b790 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
1b7a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b7b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b7d0 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
1b7e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
1b7f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b800 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
1b810 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1b820 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
1b830 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
1b840 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
1b850 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
1b860 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
1b870 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
1b880 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
1b890 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1b8a0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
1b8b0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
1b8c0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
1b8d0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1b8e0 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
1b8f0 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
1b900 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
1b910 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
1b920 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
1b930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
1b940 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
1b950 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
1b960 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
1b970 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
1b980 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
1b990 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b9a0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b9b0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1b9c0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
1b9d0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1b9e0 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
1b9f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1ba00 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
1ba10 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
1ba20 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
1ba30 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
1ba40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ba50 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
1ba60 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1ba70 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
1ba80 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ba90 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
1baa0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bab0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
1bac0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bad0 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
1bae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1baf0 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
1bb00 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
1bb10 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
1bb20 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
1bb30 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
1bb40 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
1bb50 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
1bb60 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
1bb70 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1bb80 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1bb90 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
1bba0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bbb0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
1bbc0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
1bbd0 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
1bbe0 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
1bbf0 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
1bc00 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bc10 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
1bc20 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1bc30 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
1bc40 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
1bc50 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
1bc60 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1bc70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
1bc80 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
1bc90 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
1bca0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
1bcb0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
1bcc0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
1bcd0 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
1bce0 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
1bcf0 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
1bd00 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
1bd10 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1bd20 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
1bd30 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
1bd40 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1bd50 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
1bd60 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
1bd70 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
1bd80 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1bd90 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
1bda0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
1bdb0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
1bdc0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
1bdd0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
1bde0 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
1bdf0 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
1be00 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
1be10 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
1be20 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
1be30 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
1be40 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
1be50 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
1be60 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1be70 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
1be80 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20  int wrflag, int 
1be90 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29  *pSchemaVersion)
1bea0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1beb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1bec0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bed0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1bee0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1bef0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bf00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1bf10 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1bf20 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1bf30 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1bf40 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1bf50 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bf60 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1bf70 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1bf80 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1bf90 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1bfa0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1bfb0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1bfc0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1bfd0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1bfe0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1bff0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c000 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1c010 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c020 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1c030 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1c040 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1c050 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e  0 );..  if( (p->
1c060 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c070 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
1c080 29 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ) .   && sqlite3
1c090 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
1c0a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
1c0b0 0a 20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62  .  ){.    pBt->b
1c0c0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c0d0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  READ_ONLY;.  }..
1c0e0 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1c0f0 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1c100 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1c110 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1c120 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1c130 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1c140 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1c150 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1c160 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1c170 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1c180 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1c190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c1a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c1b0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1c1c0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1c1d0 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1c1e0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1c1f0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1c200 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1c210 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1c220 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1c230 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1c240 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1c250 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1c260 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1c270 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1c280 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1c290 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1c2a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c2b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c2c0 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1c2d0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1c2e0 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1c2f0 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1c300 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1c310 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1c320 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1c330 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1c340 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1c350 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1c360 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1c370 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c380 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1c390 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1c3a0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1c3b0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1c3c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c3d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c3e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c3f0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1c400 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1c410 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1c420 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1c430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1c440 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1c450 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1c460 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1c470 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1c480 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1c490 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1c4a0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1c4b0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1c4c0 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1c4d0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1c4e0 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1c4f0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1c500 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1c510 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1c520 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1c530 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1c540 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1c550 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c560 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1c570 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1c580 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c590 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1c5a0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1c5b0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1c5c0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c5d0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1c5e0 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1c5f0 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1c600 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1c610 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1c620 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1c630 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1c640 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1c650 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1c660 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1c670 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1c680 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1c690 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1c6a0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c6b0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1c6c0 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1c6d0 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1c6e0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1c6f0 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1c700 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1c710 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c720 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1c730 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1c740 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1c750 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1c760 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1c770 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1c780 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1c790 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1c7a0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1c7b0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1c7c0 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1c7d0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1c7e0 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1c7f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c800 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c810 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1c820 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c830 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c840 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c850 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c860 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c880 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1c890 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1c8a0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1c8b0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1c8c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c8d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c8e0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c8f0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c900 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c910 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  c==SQLITE_BUSY_S
1c920 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e  NAPSHOT && pBt->
1c930 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c940 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1c950 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
1c960 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61  re was no transa
1c970 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65  ction opened whe
1c980 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c990 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1c9a0 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49   called and SQLI
1c9b0 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1c9c0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68   is returned, ch
1c9d0 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20  ange the error. 
1c9e0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c9f0 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   to SQLITE_BUSY.
1ca00 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1ca10 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1ca20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca30 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1ca40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ca50 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1ca60 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1ca70 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1ca80 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1ca90 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1caa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1cab0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1cac0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1cad0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1cae0 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  (pBt) );.  sqlit
1caf0 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
1cb00 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61  Timeout(pBt->pPa
1cb10 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ger);..  if( rc=
1cb20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb30 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cb40 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1cb50 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1cb60 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1cb70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1cb80 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1cb90 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1cba0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1cbb0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1cbc0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1cbd0 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1cbe0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1cbf0 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1cc00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1cc10 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1cc20 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1cc30 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1cc40 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1cc50 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1cc60 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1cc70 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1cc80 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1cc90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1cca0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ccb0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1ccc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1ccd0 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1cce0 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1ccf0 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1cd00 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1cd10 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1cd20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1cd30 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1cd40 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1cd50 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1cd60 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1cd70 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1cd80 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1cd90 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1cda0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1cdb0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1cdc0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1cdd0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1cde0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1cdf0 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1ce00 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1ce10 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1ce20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1ce30 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1ce40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce50 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1ce60 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1ce70 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1ce80 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1ce90 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1cea0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1ceb0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1cec0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1ced0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1cee0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1cef0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1cf00 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1cf10 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1cf20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cf30 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cf40 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1cf50 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1cf60 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1cf70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1cf80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cf90 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1cfa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cfb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cfc0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1cfd0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1cfe0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1cff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d010 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1d020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d030 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68   ){.    if( pSch
1d040 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20  emaVersion ){.  
1d050 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73      *pSchemaVers
1d060 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  ion = get4byte(&
1d070 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1d080 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  ta[40]);.    }. 
1d090 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1d0a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1d0b0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1d0c0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1d0d0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1d0e0 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a  mber of.      **
1d0f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1d100 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1d110 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1d120 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1d130 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62        ** the sub
1d140 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1d150 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1d160 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1d170 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20  ened here..     
1d180 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1d190 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1d1a0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1d1b0 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1d1c0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1d1d0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1d1e0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1d1f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d200 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d210 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d220 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d230 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1d240 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1d250 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1d260 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1d270 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1d280 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1d290 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1d2a0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1d2b0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1d2c0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1d2d0 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1d2e0 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1d2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d300 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1d310 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1d320 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1d350 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1d360 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d380 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d390 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1d3a0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d3d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1d3e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d3f0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1d400 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1d410 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1d420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d430 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1d440 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1d450 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1d460 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1d470 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1d480 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d490 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d4a0 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1d4b0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1d4c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1d4d0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1d4e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1d4f0 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1d500 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1d510 28 70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70  (pPage, pPage, p
1d520 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1d530 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d540 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1d550 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1d560 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1d570 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d580 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1d590 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1d5a0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d5b0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1d5c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1d5d0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1d5e0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d5f0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d600 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1d610 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1d620 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1d630 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1d640 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1d660 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1d670 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d680 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1d690 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1d6a0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1d6b0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1d6c0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1d6d0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1d6e0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1d6f0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1d700 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1d710 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1d720 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1d730 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d740 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d750 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d770 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1d780 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1d790 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1d7a0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d7b0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d7c0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1d7d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d7e0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1d7f0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1d800 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1d810 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d820 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1d830 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1d840 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d850 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1d860 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1d870 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1d880 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1d890 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1d8a0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1d8b0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1d8c0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1d8d0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1d8e0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1d8f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d900 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1d910 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d920 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1d930 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1d940 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1d950 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d960 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1d970 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1d980 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1d990 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1d9a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1d9b0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1d9c0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1d9d0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1d9e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1da00 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1da10 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1da20 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1da30 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1da40 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1da50 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1da60 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61  c;..    rc = pPa
1da70 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c  ge->isInit ? SQL
1da80 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e  ITE_OK : btreeIn
1da90 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1daa0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1dab0 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1dac0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1dad0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1dae0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1daf0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1db00 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1db10 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1db20 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1db30 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1db40 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1db50 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1db60 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1db70 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1db80 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1db90 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1dba0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
1dbb0 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66     if( pCell+inf
1dbc0 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d  o.nSize > pPage-
1dbd0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42  >aData+pPage->pB
1dbe0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1dc00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dc10 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1dc20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc30 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
1dc40 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1dc50 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b  info.nSize-4) ){
1dc60 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1dc70 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1dc80 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a  .nSize-4, iTo);.
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1dca0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1dcb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dcc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1dcd0 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1dce0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1dcf0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1dd00 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1dd10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dd30 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1dd40 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1dd50 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1dd60 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1dd70 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1dd80 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1dd90 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1dda0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1ddb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ddc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1ddd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1dde0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ddf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1de00 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1de10 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1de20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1de30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1de40 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1de50 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1de60 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1de70 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1de80 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1de90 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1dea0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1deb0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1dec0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1ded0 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1dee0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1def0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1df00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1df10 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1df20 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1df30 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1df40 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1df50 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1df60 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1df70 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1df80 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1df90 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1dfa0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1dfb0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1dfc0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1dfd0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1dfe0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1dff0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1e000 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1e010 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1e020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e030 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1e040 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1e050 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1e060 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1e070 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1e080 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1e090 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1e0a0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1e0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e0c0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1e0d0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1e0e0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1e0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1e100 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1e110 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1e120 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1e130 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1e140 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1e150 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1e160 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1e170 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1e180 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1e190 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1e1a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e1b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1e1c0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1e1d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e1e0 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1e1f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1e200 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1e210 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1e220 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1e230 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1e240 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e250 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e260 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e270 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1e280 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62  pBt );.  if( iDb
1e290 50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20  Page<3 ) return 
1e2a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e2b0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  KPT;..  /* Move 
1e2c0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1e2d0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1e2e0 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1e2f0 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1e300 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1e310 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1e320 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1e330 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1e340 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1e350 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1e360 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1e370 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1e380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1e390 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1e3a0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1e3b0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1e3c0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1e3d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e3f0 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1e400 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1e410 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1e420 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1e430 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1e440 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1e450 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1e460 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1e470 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1e480 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e490 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1e4a0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1e4b0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1e4c0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1e4d0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1e4e0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1e4f0 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1e500 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1e510 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1e520 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1e530 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1e540 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1e550 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1e560 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1e570 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1e580 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1e590 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1e5a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1e5b0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1e5c0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1e5d0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e5e0 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e5f0 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e620 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e640 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e650 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e660 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e670 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e680 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e690 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e6a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e6b0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e6c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e6d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e6e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e6f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e700 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e710 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e720 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e730 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e740 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e750 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e760 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e770 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e780 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e790 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e7a0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e7b0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e7c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e7d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e7e0 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e7f0 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e830 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e840 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e850 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e870 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e880 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e8a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e8b0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e8c0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e8d0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e8e0 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e8f0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e900 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e920 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e930 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e940 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e950 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e960 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e970 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e980 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e990 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1e9a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e9b0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1e9c0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1e9d0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1e9e0 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1e9f0 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1ea00 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1ea10 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1ea20 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1ea30 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1ea40 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1ea50 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1ea60 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1ea70 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1ea80 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ea90 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1eaa0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1eab0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1eac0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1ead0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1eae0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1eaf0 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1eb00 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1eb10 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1eb20 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1eb30 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1eb40 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1eb50 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1eb60 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1eb70 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1eb80 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1eb90 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1eba0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1ebb0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1ebc0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1ebd0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1ebe0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1ebf0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1ec00 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1ec10 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1ec20 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1ec30 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1ec40 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1ec50 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1ec60 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1ec70 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1ec80 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1ec90 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1eca0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1ecb0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1ecc0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1ecd0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1ece0 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ecf0 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1ed00 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ed10 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1ed20 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1ed30 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1ed40 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1ed50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1ed60 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1ed70 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1ed80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ed90 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1eda0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1edb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1edc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1edd0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1ede0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1edf0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1ee00 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1ee10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ee20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1ee30 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1ee40 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1ee50 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1ee60 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1ee70 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1ee80 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1ee90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1eea0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1eeb0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1eec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1eed0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1eee0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1eef0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1ef00 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1ef10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ef20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ef30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ef40 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1ef50 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1ef60 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ef70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ef80 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1ef90 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1efa0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1efb0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1efc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1efd0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1efe0 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1eff0 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1f000 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f010 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1f020 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1f030 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1f040 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1f050 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1f060 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1f070 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1f080 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f090 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f0a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1f0b0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1f0c0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1f0d0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1f0e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f0f0 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1f100 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1f110 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1f120 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1f130 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1f140 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1f150 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1f160 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1f170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f190 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f1a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f1b0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1f1c0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1f1d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1f1e0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1f1f0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1f200 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f220 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1f230 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1f240 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1f250 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1f260 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1f270 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1f280 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1f290 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f2a0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1f2b0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1f2c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f2d0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1f2e0 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1f2f0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1f300 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1f310 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1f320 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1f330 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f350 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f360 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f370 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1f380 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1f390 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1f3a0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1f3b0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1f3c0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1f3d0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1f3e0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1f3f0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1f400 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1f410 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1f420 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1f430 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1f440 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1f450 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1f460 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1f470 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1f480 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1f490 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1f4a0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1f4b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f4c0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1f4d0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1f4e0 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1f4f0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1f500 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1f510 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1f520 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f530 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f540 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f550 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f560 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1f570 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1f580 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f5a0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f5b0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1f5c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f5d0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f5e0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f5f0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f600 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f610 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f620 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f630 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f640 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f650 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f660 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f670 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f680 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f690 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f6a0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f6b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f6c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f6d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f6e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f6f0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f700 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f710 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f720 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f730 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f740 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f750 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f760 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f770 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f780 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f790 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f7a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f7b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f7c0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f7d0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f7e0 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f7f0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f800 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f810 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f820 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f830 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f840 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f850 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f860 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f870 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f880 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f890 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f8a0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f8b0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f8c0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f8d0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f900 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f910 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f920 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f950 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f960 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f970 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f990 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1f9a0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1f9b0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1f9c0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1f9d0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1f9e0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1f9f0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1fa00 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1fa10 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1fa20 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1fa30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fa40 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1fa50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fa60 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1fa70 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1fa80 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1fa90 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1faa0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fab0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1fac0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1fad0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1fae0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1faf0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1fb00 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1fb10 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1fb20 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1fb30 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1fb40 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1fb50 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1fb60 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1fb70 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1fb80 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1fb90 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1fba0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1fbb0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1fbc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1fbd0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1fbe0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1fbf0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1fc00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fc10 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1fc20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1fc30 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1fc40 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1fc50 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1fc60 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1fc70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fc80 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1fc90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1fca0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1fcb0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1fcc0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1fcd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fce0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1fcf0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fd00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fd10 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1fd20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1fd30 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1fd40 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1fd50 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fd60 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fd70 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1fd80 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1fd90 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1fda0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1fdb0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1fdc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fdd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fde0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1fdf0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1fe00 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fe10 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fe20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fe30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe40 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1fe50 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1fe60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1fe70 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1fe80 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1fe90 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1fea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1feb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1fec0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fed0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1fee0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1fef0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ff00 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ff10 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1ff20 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ff30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1ff40 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ff50 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ff60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ff70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ff80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ff90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1ffa0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1ffb0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1ffc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1ffd0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1ffe0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1fff0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
20000 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
20010 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
20020 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
20030 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
20040 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
20050 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
20060 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
20070 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
20080 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
20090 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
200a0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
200b0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
200c0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
200d0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
200e0 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
200f0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
20100 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
20110 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
20120 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20130 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
20140 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
20150 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
20160 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
20170 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
20180 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
20190 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
201a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
201b0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
201c0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
201d0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
201e0 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
201f0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
20200 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
20210 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20220 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20230 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
20240 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
20250 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
20260 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
20270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20280 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
20290 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
202a0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
202b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
202c0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
202d0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
202e0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
202f0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
20300 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
20310 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
20320 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20330 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
20340 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
20350 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
20360 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
20370 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
20380 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
20390 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
203a0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
203b0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
203c0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
203d0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
203e0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
203f0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
20400 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
20410 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
20420 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
20430 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
20440 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20450 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20460 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
20470 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
20480 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20490 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
204a0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
204b0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
204c0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
204d0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
204e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
204f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20500 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
20510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
20520 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20530 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
20540 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
20550 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
20560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
20570 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
20580 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
20590 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
205a0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
205b0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
205c0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
205d0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
205e0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
205f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20600 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20610 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20620 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20630 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20640 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
20650 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20660 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
20670 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
20680 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20690 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
206a0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
206b0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
206c0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
206d0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
206e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
206f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20700 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20710 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20720 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20730 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
20740 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20750 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
20760 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
20770 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20780 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
20790 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
207a0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
207b0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
207c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
207d0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
207e0 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
207f0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20800 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20810 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20820 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20830 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
20840 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
20850 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
20860 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
20870 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
20880 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
20890 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
208a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
208b0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
208c0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
208d0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
208e0 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
208f0 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20900 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20910 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20920 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20930 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
20940 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
20950 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
20960 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
20970 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
20980 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
20990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
209a0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
209b0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
209c0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
209d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
209e0 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
209f0 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20a00 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20a10 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20a20 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20a30 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
20a40 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
20a50 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
20a60 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20a70 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
20a80 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
20a90 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
20aa0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
20ab0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
20ac0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20ad0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20ae0 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20af0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20b00 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20b10 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20b20 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20b30 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
20b40 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
20b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20b60 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
20b70 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
20b80 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
20b90 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
20ba0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
20bb0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
20bc0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
20bd0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20be0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20bf0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20c00 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20c10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20c20 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20c30 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
20c40 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20c50 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
20c60 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
20c70 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
20c80 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
20c90 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
20ca0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
20cb0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
20cc0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
20cd0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20ce0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20cf0 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20d00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20d20 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20d30 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20d40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20d50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20d60 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20d70 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20d80 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
20d90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20da0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20db0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
20dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20dd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20de0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20df0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20e00 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20e10 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20e40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20e50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20e60 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20e70 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20e80 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20e90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20ea0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20eb0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
20ec0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
20ed0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20ee0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20ef0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20f00 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20f10 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20f20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20f30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20f50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20f60 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20f70 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20f80 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20f90 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
20fa0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
20fb0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
20fc0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
20fd0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
20fe0 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
20ff0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21000 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
21010 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
21020 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21030 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
21040 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21050 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21060 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
21070 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
21080 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21090 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
210a0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
210b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
210c0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
210d0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
210e0 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
210f0 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
21100 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
21110 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
21120 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
21130 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
21140 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
21150 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
21160 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
21170 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
21180 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
21190 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
211a0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
211b0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
211c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
211d0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
211e0 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
211f0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
21200 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
21210 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
21220 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
21230 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
21240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
21250 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
21260 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
21270 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
21280 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
21290 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
212a0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
212b0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
212c0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
212d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
212e0 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
212f0 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
21300 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21310 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21320 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
21330 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
21340 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
21350 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
21360 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
21370 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
21380 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
21390 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
213a0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
213b0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
213c0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
213d0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
213e0 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
213f0 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
21400 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
21410 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
21420 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
21430 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
21440 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
21450 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
21460 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
21470 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
21480 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
21490 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
214a0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
214b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
214c0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
214d0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
214e0 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
214f0 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
21500 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21510 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
21520 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21530 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
21540 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
21550 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
21560 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
21570 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
21580 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
21590 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
215a0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
215b0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
215c0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
215d0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
215e0 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
215f0 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21600 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21610 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21620 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21630 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
21640 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
21650 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
21660 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
21670 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
21680 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
21690 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
216a0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
216b0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
216c0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
216d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
216e0 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
216f0 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21700 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21710 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21720 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21730 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21740 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
21750 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
21760 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
21770 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
21780 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
21790 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
217a0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
217b0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
217c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
217d0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
217e0 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
217f0 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21800 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21810 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21820 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21830 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
21840 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21850 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
21860 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
21870 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
21880 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
21890 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
218a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
218b0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
218c0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
218d0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
218e0 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
218f0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21900 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21910 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21920 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21930 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
21940 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
21950 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
21960 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
21970 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
21980 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
21990 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
219a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
219b0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
219c0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
219d0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
219e0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
219f0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21a00 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21a10 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21a20 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21a30 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
21a40 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
21a50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21a60 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
21a70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
21a80 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
21a90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
21aa0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
21ab0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
21ac0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
21ad0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21ae0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21af0 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21b00 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21b10 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21b20 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21b30 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21b40 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
21b50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21b60 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21b70 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21b80 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
21b90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21ba0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
21bb0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
21bc0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
21bd0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21be0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21bf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21c00 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21c20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21c30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21c40 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
21c50 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
21c60 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
21c70 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
21c80 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
21c90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21ca0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
21cb0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21cc0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21cd0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21ce0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21cf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21d00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21d10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21d20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21d30 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21d40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21d50 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21d70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21d80 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21d90 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21da0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
21db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21dd0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21de0 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21df0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21e00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21e30 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21e40 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21e50 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21e60 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21e70 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21e80 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21e90 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21ea0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21eb0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21ec0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
21ed0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21ee0 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21ef0 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21f00 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21f10 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21f20 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21f30 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21f40 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21f50 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21f60 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21f70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21f80 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21f90 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
21fa0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
21fb0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
21fc0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
21fd0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
21fe0 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
21ff0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
22000 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
22010 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
22020 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
22030 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
22040 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
22050 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
22060 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
22070 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
22080 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
22090 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
220a0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
220b0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
220c0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
220d0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
220e0 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
220f0 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
22100 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
22110 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
22120 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
22130 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
22140 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
22150 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
22160 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
22170 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
22180 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
22190 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
221a0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
221b0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
221c0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
221d0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
221e0 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
221f0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
22200 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
22210 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
22220 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
22230 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
22240 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
22250 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
22260 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
22270 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
22280 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22290 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
222a0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
222b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
222c0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
222d0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
222e0 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
222f0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22300 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22310 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
22320 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
22330 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22340 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
22350 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
22360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
22370 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
22380 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
22390 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
223a0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
223b0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
223c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
223d0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
223e0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
223f0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
22400 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
22410 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
22420 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
22430 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
22440 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22450 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
22460 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
22470 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22480 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
22490 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
224a0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
224b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
224c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
224d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
224e0 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
224f0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
22500 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
22510 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22520 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
22540 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22550 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
22560 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
22570 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
22580 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
22590 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
225a0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
225b0 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
225c0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
225d0 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
225e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
225f0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22610 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22620 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22630 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
22640 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
22650 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
22660 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
22670 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
22680 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
22690 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
226a0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
226b0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
226c0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
226d0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
226e0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
226f0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22700 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22710 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22720 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22730 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
22740 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
22750 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
22760 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22770 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
22780 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
22790 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
227a0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
227b0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
227c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
227d0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
227e0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
227f0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22800 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22810 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22820 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22830 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
22840 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
22850 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
22860 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
22870 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
22880 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
22890 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
228a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
228b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
228c0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
228d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
228e0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
228f0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22900 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22910 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22920 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22930 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22940 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
22950 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
22960 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
22970 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
22980 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
22990 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
229a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
229b0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
229c0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
229d0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
229e0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
229f0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22a00 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22a10 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22a20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22a30 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
22a40 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
22a50 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
22a60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22a70 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
22a80 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
22a90 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
22aa0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22ab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ac0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
22ad0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22ae0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22af0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22b00 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22b10 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22b20 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22b30 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
22b40 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
22b50 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
22b60 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
22b70 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
22b80 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
22b90 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
22ba0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
22bb0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
22bc0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
22bd0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22be0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22bf0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22c00 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22c10 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22c20 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22c30 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
22c40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22c50 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
22c60 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
22c70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
22c80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22c90 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
22ca0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
22cb0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
22cc0 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
22cd0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22ce0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22cf0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22d00 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22d10 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22d20 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22d40 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22d50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22d60 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22d70 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22d80 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22d90 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
22da0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
22db0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
22dc0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22dd0 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22de0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22df0 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22e00 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22e10 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22e20 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22e30 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22e40 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22e50 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22e60 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22e70 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
22e80 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22e90 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
22ea0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
22eb0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
22ec0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
22ed0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22ee0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22ef0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22f00 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22f10 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22f20 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22f30 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22f40 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22f50 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22f60 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22f70 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
22f80 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22f90 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
22fa0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
22fb0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22fc0 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
22fd0 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
22fe0 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
22ff0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23000 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
23010 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23020 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
23030 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
23040 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
23050 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
23060 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
23070 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
23080 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
23090 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
230a0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
230b0 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
230c0 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
230d0 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
230e0 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
230f0 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
23100 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
23110 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
23120 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
23130 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
23140 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
23150 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
23160 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
23170 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
23180 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23190 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
231a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
231b0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
231c0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
231d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
231e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
231f0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
23200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23210 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
23220 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
23230 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
23240 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
23250 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
23260 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
23270 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
23280 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
23290 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
232a0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
232b0 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
232c0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
232d0 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
232e0 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
232f0 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
23300 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
23310 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23320 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
23330 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
23340 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
23350 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
23360 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
23370 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
23380 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
23390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
233a0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
233b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
233c0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
233d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
233e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
233f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
23400 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
23410 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
23420 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
23430 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
23440 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
23450 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
23460 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
23470 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
23480 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
23490 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
234a0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
234b0 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
234c0 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
234d0 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
234e0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
234f0 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
23500 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
23510 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
23520 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
23530 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
23540 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
23550 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
23560 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
23570 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
23580 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
23590 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
235a0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
235b0 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
235c0 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
235d0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
235e0 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
235f0 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23600 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23610 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23620 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23630 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
23640 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
23650 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
23660 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23670 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
23680 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
23690 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
236a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
236b0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
236c0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
236d0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
236e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
236f0 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23700 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23710 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23720 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23730 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
23740 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23750 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
23760 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
23770 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
23780 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
23790 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
237a0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
237b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
237c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
237d0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
237e0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
237f0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23810 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23820 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23830 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
23840 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
23850 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
23860 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23870 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
23880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
23890 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
238a0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
238b0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
238c0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
238d0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
238e0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
238f0 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23900 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23910 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23920 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23930 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23940 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
23950 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
23960 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
23970 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
23980 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
23990 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
239a0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
239b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
239c0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
239d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
239e0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
239f0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23a00 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23a10 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23a20 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23a30 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
23a40 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
23a50 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
23a60 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
23a70 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
23a80 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
23a90 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
23aa0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
23ab0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
23ac0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
23ad0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23ae0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23af0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23b00 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23b10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23b20 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23b30 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
23b40 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
23b50 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
23b60 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
23b70 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
23b80 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
23b90 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
23ba0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
23bb0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
23bc0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
23bd0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23be0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23bf0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23c00 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23c10 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23c20 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23c30 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
23c40 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
23c50 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
23c60 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
23c70 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
23c80 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
23c90 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
23ca0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
23cb0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
23cc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
23cd0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23ce0 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23cf0 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23d00 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23d10 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23d20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23d30 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23d40 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23d50 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23d60 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23d70 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
23d80 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
23d90 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
23da0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
23db0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
23dc0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
23dd0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23de0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23df0 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23e00 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23e10 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23e20 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23e30 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23e40 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23e50 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23e60 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23e70 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
23e80 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
23e90 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
23ea0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
23eb0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
23ec0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
23ed0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23ee0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23ef0 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23f00 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23f10 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23f20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23f30 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23f40 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23f50 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23f60 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23f70 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
23f80 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
23f90 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
23fa0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
23fb0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
23fc0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
23fd0 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
23fe0 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
23ff0 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
24000 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
24010 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
24020 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
24030 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
24040 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
24050 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
24060 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
24070 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
24080 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
24090 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
240a0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
240b0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
240c0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
240d0 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
240e0 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
240f0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
24100 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24110 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
24120 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
24130 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
24140 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
24150 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
24160 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
24170 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
24180 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
24190 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
241a0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
241b0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
241c0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
241d0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
241e0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
241f0 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
24200 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
24210 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
24220 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
24230 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24260 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
24270 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
242a0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
242b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
242c0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242e0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
242f0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
24300 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
24310 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
24320 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24330 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
24340 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
24350 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
24380 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
24390 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
243a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243c0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
243d0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
243e0 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
24410 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
24420 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
24430 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
24440 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
24450 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24460 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
24470 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
24480 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
24490 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
244a0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
244b0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
244c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
244d0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
244e0 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
244f0 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24500 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
24510 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
24520 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24530 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
24540 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
24550 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
24560 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
24570 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
24580 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
24590 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
245a0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
245b0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
245c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
245d0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
245e0 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
245f0 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24600 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24610 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24620 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24630 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24640 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
24650 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
24660 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
24670 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
24680 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
24690 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
246a0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
246b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
246c0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
246d0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
246e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
246f0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24700 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24710 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24720 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24730 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
24740 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
24750 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
24760 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
24770 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
24780 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
24790 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
247a0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
247b0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
247c0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
247d0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
247e0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
247f0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24800 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24810 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24820 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24830 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
24840 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
24850 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
24860 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
24870 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
24880 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
24890 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
248a0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
248b0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
248c0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
248d0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
248e0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
248f0 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24900 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24910 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24920 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24930 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
24940 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
24950 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
24960 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
24970 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
24980 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
24990 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
249a0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
249b0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
249c0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
249d0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
249e0 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
249f0 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24a00 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24a10 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24a20 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24a30 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
24a40 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
24a50 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
24a60 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24a70 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
24a80 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
24a90 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24aa0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
24ab0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
24ac0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24ad0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24ae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24af0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24b00 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24b10 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b30 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24b40 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24b50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
24b80 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
24b90 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
24ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bc0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24bd0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24be0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24bf0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c10 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24c20 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24c30 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24c60 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
24c70 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
24c80 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
24c90 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
24ca0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24cb0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
24cc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24cd0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24ce0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24cf0 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24d00 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24d10 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24d20 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24d40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24d50 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24d60 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24d70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
24d80 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
24d90 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
24da0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
24db0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
24dc0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
24dd0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24de0 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24df0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24e00 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24e10 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24e20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24e30 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24e40 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24e50 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24e60 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24e70 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
24e80 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
24e90 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
24ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
24eb0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
24ec0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
24ed0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24ee0 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24ef0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24f00 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24f10 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24f20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24f30 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24f40 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24f50 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24f60 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24f70 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
24f80 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
24f90 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
24fa0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
24fb0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
24fc0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
24fd0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
24fe0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
24ff0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
25000 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
25010 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
25020 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
25030 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
25040 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53  BtCursor, BTCURS
25050 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29  OR_FIRST_UNINIT)
25060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
25070 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
25080 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
25090 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
250a0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
250b0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
250c0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
250d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
250e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
250f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25100 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
25110 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
25120 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
25130 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
25140 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
25150 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
25160 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
25170 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
25180 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
25190 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
251a0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
251b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
251c0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
251d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
251e0 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
251f0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
25200 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
25210 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
25220 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
25230 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
25240 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
25250 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25270 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
25280 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
25290 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
252a0 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
252b0 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
252c0 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
252d0 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
252e0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
252f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25300 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
25310 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
25320 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
25330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25340 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
25350 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65  .    pCur->pBtre
25360 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
25370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25380 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
25390 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
253a0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
253b0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
253c0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
253d0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
253e0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
253f0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
25400 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
25410 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
25420 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
25430 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
25440 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
25450 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
25460 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
25470 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
25480 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
25490 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
254a0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
254b0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
254c0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65  .  static int ce
254d0 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c  llInfoEqual(Cell
254e0 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66  Info *a, CellInf
254f0 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61  o *b){.    if( a
25500 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20  ->nKey!=b->nKey 
25510 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25520 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21  if( a->pPayload!
25530 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72  =b->pPayload ) r
25540 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
25550 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d   a->nPayload!=b-
25560 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >nPayload ) retu
25570 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25580 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63  >nLocal!=b->nLoc
25590 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
255a0 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21     if( a->nSize!
255b0 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75  =b->nSize ) retu
255c0 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 0;.    return
255d0 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   1;.  }.  static
255e0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
255f0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
25600 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
25610 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
25620 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
25630 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
25640 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25650 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
25660 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
25670 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
25680 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66  PT_DB || cellInf
25690 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70  oEqual(&info, &p
256a0 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20  Cur->info) );.  
256b0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
256c0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
256d0 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
256e0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
256f0 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
25700 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25710 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
25720 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
25730 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
25740 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
25750 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
25760 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
25770 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
25780 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
25790 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
257a0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
257b0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
257c0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
257d0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
257e0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
257f0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
25800 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
25810 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
25820 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
25830 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
25840 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
25850 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
25860 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
25870 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
25880 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
25890 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
258a0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
258b0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
258c0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
258d0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
258e0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
258f0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
25900 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
25910 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
25920 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25930 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
25940 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
25950 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25960 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
25970 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25980 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
25990 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
259a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
259b0 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
259c0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
259d0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
259e0 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
259f0 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
25a00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25a10 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
25a20 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
25a30 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
25a40 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
25a50 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
25a60 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25a70 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
25a80 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
25a90 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
25aa0 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
25ab0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
25ac0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
25ad0 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
25ae0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25af0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25b00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25b20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25b30 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25b40 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
25b50 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
25b60 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25b70 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25b80 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  .nKey;.}..#ifdef
25b90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
25ba0 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
25bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25bc0 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
25bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
25be0 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
25bf0 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f  he.** payload to
25c00 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
25c10 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
25c20 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
25c30 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f  eeOffset(BtCurso
25c40 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25c50 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25c60 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25c70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25c80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25c90 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25ca0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25cb0 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70  urn (i64)pCur->p
25cc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69  Bt->pageSize*((i
25cd0 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  64)pCur->pPage->
25ce0 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20  pgno - 1) +.    
25cf0 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d       (i64)(pCur-
25d00 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  >info.pPayload -
25d10 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44   pCur->pPage->aD
25d20 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ata);.}.#endif /
25d30 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
25d40 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
25d50 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25d60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25d70 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
25d80 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25d90 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
25da0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25db0 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
25dc0 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
25dd0 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
25de0 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
25df0 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
25e00 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25e10 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
25e20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
25e30 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
25e40 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
25e50 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
25e60 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
25e70 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
25e80 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25e90 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
25ea0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
25eb0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
25ec0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
25ed0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25ee0 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
25ef0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
25f00 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
25f10 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25f20 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25f30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25f40 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25f50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25f60 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25f70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
25f80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25f90 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
25fa0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
25fb0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
25fc0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
25fd0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
25fe0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
25ff0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
26000 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
26010 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
26020 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
26030 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
26040 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
26050 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
26060 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
26070 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
26080 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
26090 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
260a0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
260b0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
260c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
260d0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
260e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
260f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
26100 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
26110 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26120 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26130 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
26140 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
26150 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
26160 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
26170 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
26180 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
26190 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
261a0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
261b0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
261c0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
261d0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
261e0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
261f0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
26200 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
26210 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
26220 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
26230 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
26240 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
26250 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
26260 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
26270 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
26280 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
26290 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
262a0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
262b0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
262c0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
262d0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
262e0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
262f0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
26300 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
26310 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
26320 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
26330 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
26340 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
26350 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
26360 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
26370 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
26380 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
26390 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
263a0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
263b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
263c0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
263d0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
263e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
263f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
26400 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
26410 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
26420 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
26430 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
26440 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
26450 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26460 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
26470 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
26480 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
26490 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
264a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
264b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
264c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
264d0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
264e0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
264f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
26510 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
26520 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26530 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
26540 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
26550 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
26560 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
26570 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
26580 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
26590 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
265a0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
265b0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
265c0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
265d0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
265e0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
265f0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
26600 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
26610 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
26620 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
26630 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
26640 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
26650 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26660 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
26670 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
26680 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
26690 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
266a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
266b0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
266c0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
266d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
266e0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
266f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26700 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
26710 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
26720 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26730 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
26740 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
26750 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26760 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
26770 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
26780 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
26790 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
267a0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
267b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
267c0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
267d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
267e0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
267f0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
26800 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
26810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26820 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26830 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
26840 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
26850 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
26860 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
26870 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
26880 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
26890 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
268a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
268b0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
268c0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
268d0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
268e0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
268f0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
26900 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
26910 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
26920 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
26930 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
26940 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
26950 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
26960 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
26970 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
26980 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
26990 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
269a0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
269b0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
269c0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
269d0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
269e0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
269f0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
26a00 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
26a10 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
26a20 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
26a30 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
26a40 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
26a50 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
26a60 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
26a70 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
26a80 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
26a90 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
26aa0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
26ab0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
26ac0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
26ad0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
26ae0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
26af0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
26b00 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26b10 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
26b20 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
26b30 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26b40 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
26b50 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
26b60 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
26b70 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
26b80 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
26b90 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
26ba0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26bb0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
26bc0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
26bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26be0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
26bf0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
26c00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26c10 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
26c20 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
26c30 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
26c40 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
26c50 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
26c60 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
26c70 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
26c80 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
26c90 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
26ca0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
26cb0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
26cc0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
26cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26ce0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
26cf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26d20 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
26d30 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
26d40 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26d50 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26d60 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
26d70 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
26d80 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
26d90 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
26da0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
26db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26dc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
26dd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
26de0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
26df0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
26e00 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
26e10 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
26e20 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
26e30 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
26e40 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
26e50 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
26e60 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
26e70 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
26e80 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
26e90 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
26ea0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
26eb0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
26ec0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
26ed0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
26ee0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
26ef0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
26f00 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
26f10 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
26f20 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
26f30 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
26f40 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
26f50 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26f60 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
26f70 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
26f80 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
26f90 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
26fa0 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
26fb0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
26fc0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
26fd0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
26fe0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
26ff0 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
27000 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
27010 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
27020 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
27030 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
27040 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
27050 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
27060 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27070 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
27080 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
27090 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
270a0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
270b0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
270c0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
270d0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
270e0 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
270f0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
27100 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27110 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
27120 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
27130 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
27140 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
27150 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
27160 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
27170 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
27180 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
27190 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
271a0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
271b0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
271c0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
271d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
271e0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
271f0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
27200 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27210 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
27220 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
27230 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
27240 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
27250 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
27260 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
27270 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
27280 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
27290 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
272a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
272b0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
272c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
272d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
272e0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
272f0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
27300 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
27310 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
27320 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
27330 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
27340 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
27350 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
27360 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
27370 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27380 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
27390 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
273a0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
273b0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
273c0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
273d0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
273e0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
273f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27400 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
27410 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27420 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
27430 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27440 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
27450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27460 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
27470 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
27480 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
27490 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
274c0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
274d0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
274e0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
274f0 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
27500 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
27510 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
27520 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
27530 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
27540 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
27550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
27560 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
27570 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
27580 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27590 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
275a0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
275b0 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
275c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
275d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
275e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
275f0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
27600 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
27610 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
27620 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
27630 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
27640 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27650 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
27660 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
27670 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
27680 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
27690 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
276a0 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
276b0 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
276c0 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
276d0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
276e0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
276f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27700 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
27710 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
27720 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
27730 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
27740 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
27750 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27760 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
27770 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
27780 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
27790 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
277a0 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
277b0 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
277c0 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
277d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
277e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
277f0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
27800 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
27810 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
27820 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
27830 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
27840 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
27850 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
27860 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
27870 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
27880 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
27890 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
278a0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
278b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
278c0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
278d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
278e0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
278f0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
27900 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
27910 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
27920 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
27930 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
27940 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
27950 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
27960 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
27970 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
27980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
27990 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
279a0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
279b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
279c0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
279d0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
279e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
279f0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
27a00 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27a10 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
27a20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
27a30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27a40 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
27a50 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
27a60 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
27a70 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
27a80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
27a90 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
27aa0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
27ab0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
27ac0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
27ad0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
27ae0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27af0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
27b00 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
27b10 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
27b20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
27b30 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
27b40 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
27b50 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
27b60 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
27b70 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
27b80 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
27b90 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
27ba0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
27bb0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
27bc0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27bd0 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
27be0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
27bf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27c00 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
27c10 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
27c20 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
27c30 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27c40 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c  flow==0.       |
27c50 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a  | nOvfl*(int)siz
27c60 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27c70 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
27c80 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
27c90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27ca0 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
27cb0 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
27cc0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
27cd0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
27ce0 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
27cf0 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
27d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
27d10 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d30 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d50 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27d60 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27d80 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
27d90 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
27da0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
27db0 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
27dc0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
27dd0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
27de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27df0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
27e00 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27e10 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27e20 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
27e30 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
27e40 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
27e50 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27e60 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27e70 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
27e80 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
27e90 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
27ea0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
27eb0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
27ec0 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
27ed0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
27ee0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27ef0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27f00 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27f10 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27f20 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27f30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27f40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27f50 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27f60 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27f70 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27f80 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
27f90 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
27fa0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27fb0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
27fc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27fd0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27fe0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27ff0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
28000 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
28010 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
28020 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
28030 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
28040 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
28050 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
28060 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
28070 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
28080 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
28090 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
280a0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
280b0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
280c0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
280d0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
280e0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
280f0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
28100 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
28110 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
28120 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
28130 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
28140 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
28150 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
28160 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
28170 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
28180 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
28190 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
281a0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
281b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
281c0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
281d0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
281e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
281f0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
28200 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
28210 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
28220 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28230 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
28240 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
28250 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28260 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
28270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
28280 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
28290 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
282a0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
282b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
282c0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
282d0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
282e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
282f0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
28300 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
28310 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
28320 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
28330 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
28340 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
28350 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
28360 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
28370 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
28380 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
28390 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
283a0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
283b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
283c0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
283d0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
283e0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
283f0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
28400 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
28410 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
28420 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
28430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28440 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
28450 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
28460 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
28470 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
28480 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
28490 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
284a0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
284b0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
284c0 20 20 20 33 29 20 74 68 65 72 65 20 61 72 65 20     3) there are 
284d0 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20 69  no dirty pages i
284e0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
284f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
28500 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28510 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
28520 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
28530 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
28540 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
28550 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
28560 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
28570 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
28580 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
28590 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
285a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
285b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
285c0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
285d0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
285e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
285f0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
28600 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
28610 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
28620 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
28630 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
28640 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
28650 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
28660 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
28670 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
28680 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
28690 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
286a0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
286b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
286d0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
286e0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
28720 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  /.         && sq
28730 6c 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74  lite3PagerDirect
28740 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61 67  ReadOk(pBt->pPag
28750 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
28760 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a 20   /* (3,4,5) */. 
28770 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
28780 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287b0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
287c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
287d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
287e0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
287f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
28800 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
28810 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
28820 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
28830 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
28840 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
28850 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f         /* due to
28880 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
28890 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
288a0 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
288b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
288c0 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
288d0 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
288e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
288f0 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
28900 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
28910 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
28920 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
28930 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
28940 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
28950 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
28960 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
28970 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
28980 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
28990 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
289a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
289b0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
289c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
289d0 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f  (eOp==0 ? PAGER_
289e0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
289f0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
28a00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
28a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28a20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
28a30 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
28a40 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
28a50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
28a60 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28a70 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
28a80 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
28a90 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
28aa0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
28ab0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
28ac0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28ad0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
28ae0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
28af0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
28b00 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
28b10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28b20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
28b30 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d          if( amt=
28b40 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
28b50 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
28b60 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  a;.      }.     
28b70 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
28b80 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20  .      iIdx++;. 
28b90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
28ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28bb0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a   amt>0 ){.    /*
28bc0 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   Overflow chain 
28bd0 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79  ends prematurely
28be0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
28bf0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
28c00 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
28c10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28c20 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
28c30 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
28c40 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69  r the row at whi
28c50 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ch that cursor p
28c60 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
28c70 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22  .** pointing.  "
28c80 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
28c90 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
28ca0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
28cb0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
28cc0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
28cd0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20  .**.** pCur can 
28ce0 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  be pointing to e
28cf0 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72  ither a table or
28d00 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
28d10 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67  ..** If pointing
28d20 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65   to a table btre
28d30 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  e, then the cont
28d40 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72  ent section is r
28d50 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72  ead.  If.** pCur
28d60 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
28d70 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
28d80 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63  then the key sec
28d90 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a  tion is read..**
28da0 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42  .** For sqlite3B
28db0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74  treePayload(), t
28dc0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
28dd0 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
28de0 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  is pointing.** t
28df0 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e  o a valid row in
28e00 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72   the table.  For
28e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28e20 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74  loadChecked(), t
28e30 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67  he.** cursor mig
28e40 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72  ht be invalid or
28e50 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
28e60 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  e restored befor
28e70 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a  e being read..**
28e80 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
28e90 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
28ea0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
28eb0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
28ec0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
28ed0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
28ee0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
28ef0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
28f00 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
28f10 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
28f20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
28f30 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a  yload(BtCursor *
28f40 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
28f50 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
28f60 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
28f70 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28f80 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28f90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28fa0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28fc0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
28fd0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
28fe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28ff0 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
29000 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
29010 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29020 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29030 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
29040 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
29050 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e  *.** This varian
29060 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  t of sqlite3Btre
29070 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73  ePayload() works
29080 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72   even if the cur
29090 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69  sor has not.** i
290a0 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c  n the CURSOR_VAL
290b0 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73  ID state.  It is
290c0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68   only used by th
290d0 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
290e0 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  ead().** interfa
290f0 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
29100 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
29110 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54  LOB.static SQLIT
29120 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61  E_NOINLINE int a
29130 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
29140 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
29150 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66  *pCur,.  u32 off
29160 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a  set,.  u32 amt,.
29170 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a    void *pBuf.){.
29180 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28    int rc;.  if (
29190 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
291a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
291b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
291c0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
291d0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
291e0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
291f0 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
29200 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
29210 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72  ition(pCur);.  r
29220 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20  eturn rc ? rc : 
29230 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29240 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29250 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74   pBuf, 0);.}.int
29260 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
29270 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75  loadChecked(BtCu
29280 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
29290 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
292a0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
292b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
292c0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
292d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75  {.    assert( cu
292e0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
292f0 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65  (pCur) );.    re
29300 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
29310 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
29320 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
29330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
29340 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
29350 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f  dChecked(pCur, o
29360 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
29370 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
29380 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
29390 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
293a0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
293b0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
293c0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
293d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
293e0 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
293f0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29400 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
29410 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
29420 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
29430 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
29440 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
29450 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
29460 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
29470 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
29480 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
29490 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
294a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
294b0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
294c0 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
294d0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
294e0 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
294f0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
29500 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
29510 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
29520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
29530 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
29540 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
29550 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
29560 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
29570 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
29580 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
29590 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
295a0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
295b0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
295c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
295d0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
295e0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
295f0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
29600 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
29610 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
29620 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
29630 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
29640 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
29650 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
29660 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
29670 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
29680 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
29690 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
296a0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
296b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
296c0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
296d0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
296e0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
296f0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
29700 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
29710 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
29720 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
29730 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
29740 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
29750 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
29760 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
29770 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
29780 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29790 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
297a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
297b0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
297c0 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
297d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
297e0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
297f0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
29800 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
29810 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  t amt;.  assert(
29820 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
29830 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
29840 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73  ur->pPage);.  as
29850 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29860 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29890 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
298a0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
298b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
298c0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
298d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
298e0 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
298f0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
29900 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29910 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
29920 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29930 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
29940 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
29950 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
29960 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29970 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72  fo.pPayload<pCur
29980 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
29990 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
299a0 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69  .  amt = pCur->i
299b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66  nfo.nLocal;.  if
299c0 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72  ( amt>(int)(pCur
299d0 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
299e0 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
299f0 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20  Payload) ){.    
29a00 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20  /* There is too 
29a10 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20  little space on 
29a20 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65  the page for the
29a30 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74   expected amount
29a40 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c  .    ** of local
29a50 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61   content. Databa
29a60 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
29a70 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  pt. */.    asser
29a80 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  t( CORRUPT_DB );
29a90 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30  .    amt = MAX(0
29aa0 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  , (int)(pCur->pP
29ab0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
29ac0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
29ad0 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41  oad));.  }.  *pA
29ae0 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20  mt = (u32)amt;. 
29af0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
29b00 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29b10 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
29b20 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
29b30 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
29b40 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
29b50 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
29b60 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
29b70 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
29b80 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
29b90 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
29ba0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
29bb0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
29bc0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
29bd0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
29be0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
29bf0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
29c00 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
29c10 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
29c20 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
29c30 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
29c40 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
29c50 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
29c60 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
29c70 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
29c80 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
29c90 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
29ca0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
29cb0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
29cc0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
29cd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
29ce0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
29cf0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
29d00 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
29d10 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
29d20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
29d30 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
29d40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
29d50 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
29d60 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
29d70 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28  reePayloadFetch(
29d80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29d90 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
29da0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
29db0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
29dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
29dd0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
29de0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
29df0 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
29e00 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
29e10 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
29e20 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29e30 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
29e40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29e50 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29e60 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
29e70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
29e80 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
29e90 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
29ea0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
29eb0 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
29ec0 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
29ed0 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
29ee0 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
29ef0 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
29f00 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
29f10 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
29f20 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
29f30 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
29f40 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
29f50 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
29f60 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
29f70 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
29f80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29f90 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29fa0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29fb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29fc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29fd0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
29fe0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
29ff0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
2a000 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
2a010 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2a020 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
2a030 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
2a040 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a050 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2a060 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
2a070 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2a080 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a090 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2a0a0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a0b0 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  fl);.  pCur->aiI
2a0c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a0d0 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43  = pCur->ix;.  pC
2a0e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a0f0 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e  >iPage] = pCur->
2a100 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69  pPage;.  pCur->i
2a110 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2a120 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  Page++;.  return
2a130 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2a140 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2a150 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
2a160 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2a170 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65  Flags);.}..#ifde
2a180 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2a190 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2a1a0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2a1b0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2a1c0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2a1d0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2a1e0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2a1f0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2a200 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2a210 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2a220 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2a230 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2a240 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2a250 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2a260 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2a270 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2a280 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2a290 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2a2a0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2a2b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2a2c0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a2d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2a2e0 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2a2f0 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2a300 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2a310 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2a320 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2a330 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2a340 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2a370 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2a380 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2a390 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2a3a0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2a3b0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2a3c0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a3d0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2a3e0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2a3f0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2a400 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2a410 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a420 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2a430 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2a440 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2a450 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2a460 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a470 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2a480 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a490 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2a4a0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2a4b0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2a4c0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2a4d0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2a4e0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2a4f0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2a500 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2a510 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2a520 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2a530 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2a540 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2a550 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2a560 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2a570 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2a580 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2a590 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2a5a0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2a5b0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2a5c0 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74  *pLeaf;.  assert
2a5d0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a5e0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a5f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a600 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a610 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2a620 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2a630 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a640 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2a650 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2a660 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2a670 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2a680 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2a690 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2a6a0 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67   .    pCur->pPag
2a6b0 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  e->pgno.  );.  t
2a6c0 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
2a6d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a6e0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
2a6f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a700 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
2a710 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a720 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a730 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2a740 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2a750 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2a760 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  ->ix = pCur->aiI
2a770 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2a780 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75  ];.  pLeaf = pCu
2a790 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
2a7a0 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2a7b0 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69  apPage[--pCur->i
2a7c0 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65  Page];.  release
2a7d0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61  PageNotNull(pLea
2a7e0 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  f);.}../*.** Mov
2a7f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2a800 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2a810 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2a820 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2a830 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2a840 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2a850 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2a860 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2a870 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2a880 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2a890 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2a8a0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2a8b0 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2a8c0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2a8d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2a8e0 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2a8f0 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2a900 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2a910 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2a920 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2a930 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2a940 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2a950 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2a960 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2a970 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2a980 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2a990 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2a9a0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2a9b0 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ID and this rout
2a9c0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2a9d0 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77  TE_EMPTY. Otherw
2a9e0 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ise,.** the curs
2a9f0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2aa00 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
2aa10 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
2aa20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20  the root.** (or 
2aa30 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2aa40 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2aa50 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2aa60 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
2aa70 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
2aa80 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
2aa90 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
2aaa0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
2aab0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
2aac0 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
2aad0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
2aae0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
2aaf0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
2ab00 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
2ab10 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
2ab20 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
2ab30 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
2ab40 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
2ab50 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
2ab60 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2ab70 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2ab80 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
2ab90 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
2aba0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
2abb0 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
2abc0 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
2abd0 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
2abe0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2abf0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2ac00 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
2ac10 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
2ac20 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
2ac30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2ac40 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
2ac50 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2ac60 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
2ac70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ac80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ac90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2aca0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2acb0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2acc0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2acd0 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2ace0 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
2acf0 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
2ad00 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2ad10 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
2ad20 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
2ad30 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2ad40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ad50 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
2ad60 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
2ad70 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73  iPage<0 );.  ass
2ad80 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2ad90 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69  oot>0 || pCur->i
2ada0 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28  Page<0 );..  if(
2adb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2adc0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2add0 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2ade0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2adf0 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
2ae00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d  .      while( --
2ae10 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2ae20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ae30 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2ae40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ae50 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge]);.      }.  
2ae60 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2ae70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2ae80 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ];.      goto sk
2ae90 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20  ip_init;.    }. 
2aea0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
2aeb0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
2aec0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2aed0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2aee0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
2aef0 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65  LITE_EMPTY;.  }e
2af00 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2af10 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2af20 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  1) );.    if( pC
2af30 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2af40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2af50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2af60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2af70 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
2af80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2af90 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
2afa0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2afb0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2afc0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2afd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2afe0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
2aff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2b000 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2b010 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2b020 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b030 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
2b040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b050 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2b060 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2b070 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b090 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b0a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b0b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2b0d0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
2b0e0 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b0f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2b100 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52  intKey;.  }.  pR
2b110 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
2b120 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  e;.  assert( pRo
2b130 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
2b140 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
2b150 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
2b160 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
2b170 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
2b180 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
2b190 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
2b1a0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
2b1b0 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
2b1c0 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
2b1d0 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
2b1e0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
2b1f0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
2b200 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
2b210 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b220 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
2b230 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
2b240 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
2b250 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
2b260 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2b270 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2b280 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
2b290 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
2b2a0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
2b2b0 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
2b2c0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2b2d0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
2b2e0 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
2b2f0 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
2b300 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
2b310 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2b320 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
2b330 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
2b340 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
2b350 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
2b360 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
2b370 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
2b380 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
2b390 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
2b3a0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
2b3b0 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
2b3c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
2b3d0 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
2b3e0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2b3f0 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
2b400 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
2b410 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b420 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65  PAGE(pCur->pPage
2b430 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  );.  }..skip_ini
2b440 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20  t:  .  pCur->ix 
2b450 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
2b460 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2b470 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b480 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2b490 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2b4a0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
2b4b0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2b4c0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
2b4d0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
2b4e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b4f0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b500 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
2b510 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
2b520 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
2b530 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
2b540 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
2b550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b560 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2b570 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2b580 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2b590 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b5a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b5b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b5c0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b5d0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2b5e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2b5f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b600 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2b610 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b620 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74  EMPTY;.  }.  ret
2b630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b640 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b650 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
2b660 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2b670 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2b680 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2b690 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2b6a0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
2b6b0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
2b6c0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
2b6d0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
2b6e0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
2b6f0 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
2b700 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2b710 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
2b720 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2b730 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2b740 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b750 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2b760 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2b770 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b780 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b790 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b7a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b7b0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2b7c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b7d0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
2b7e0 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
2b7f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b800 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
2b810 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
2b820 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2b830 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b840 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->ix));.    rc =
2b850 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b860 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
2b870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b880 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b890 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2b8a0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2b8b0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b8c0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
2b8d0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b8e0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
2b8f0 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
2b900 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
2b910 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
2b920 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
2b930 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
2b940 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
2b950 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
2b960 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b970 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
2b980 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
2b990 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2b9a0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2b9b0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
2b9c0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
2b9d0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2b9e0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2b9f0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2ba00 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
2ba10 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
2ba20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2ba30 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
2ba40 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2ba50 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2ba60 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2ba70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2ba80 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
2ba90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2baa0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2bab0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2bac0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bad0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bae0 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
2baf0 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
2bb00 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
2bb10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2bb20 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2bb30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2bb40 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50     pCur->ix = pP
2bb50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2bb60 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2bb70 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2bb80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bb90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
2bba0 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2bbb0 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
2bbc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bbd0 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
2bbe0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2bbf0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2bc00 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
2bc10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2bc20 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2bc30 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
2bc40 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2bc50 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2bc60 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2bc70 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2bc80 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2bc90 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2bca0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2bcb0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2bcc0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2bcd0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2bce0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2bcf0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
2bd00 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2bd10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
2bd20 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2bd30 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2bd40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2bd50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bd60 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2bd70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2bd80 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2bd90 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2bda0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bdb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2bdc0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2bdd0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2bde0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
2bdf0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2be00 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2be10 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2be20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2be30 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2be40 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2be50 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
2be60 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
2be70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2be80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2be90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2bea0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
2beb0 20 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65   cursor pCur doe
2bec0 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  s not point to a
2bed0 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f   valid row..** O
2bee0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
2bef0 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66  r is valid, conf
2bf00 69 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74  igure it so that
2bf10 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2bf20 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
2bf30 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d  eNext() is a no-
2bf40 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  op..*/.#ifndef S
2bf50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2bf60 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74  WFUNC.void sqlit
2bf70 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28  e3BtreeSkipNext(
2bf80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2bf90 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65  .  /* We believe
2bfa0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bfb0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
2bfc0 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61  in the valid sta
2bfd0 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69  te when.  ** thi
2bfe0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2bff0 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f  led, but the pro
2c000 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c  of is difficult,
2c010 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20   so we add an.  
2c020 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74  ** ALWaYS() test
2c030 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65   just in case we
2c040 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20   are wrong. */. 
2c050 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
2c060 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c070 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
2c080 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c090 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
2c0a0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2c0b0 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  t = 1;.  }.}.#en
2c0c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2c0d0 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
2c0e0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c0f0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2c100 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2c110 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2c120 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2c130 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2c140 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2c150 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2c160 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2c170 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2c180 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2c190 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2c1a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c1b0 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2c1c0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c1d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2c1e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2c1f0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2c200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c210 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c220 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2c230 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2c240 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2c250 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2c260 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2c270 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2c280 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2c290 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2c2a0 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2c2b0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2c2c0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2c2d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c2e0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2c2f0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2c300 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2c310 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2c320 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2c330 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2c340 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2c350 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2c360 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2c370 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2c380 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2c390 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c3a0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2c3b0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2c3c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2c3d0 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2c3e0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2c3f0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2c400 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2c410 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2c420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c430 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2c440 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c450 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c460 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c470 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c480 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2c490 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2c4a0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c4b0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2c4c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c4e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2c4f0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2c500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c510 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c520 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2c530 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2c540 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2c550 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2c560 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c570 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2c580 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2c590 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2c5a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c5b0 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2c5c0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2c5d0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2c5e0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2c5f0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2c600 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2c610 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2c620 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2c630 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2c640 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2c650 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2c660 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2c670 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2c680 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2c690 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2c6a0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2c6b0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2c6c0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2c6d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2c6e0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2c6f0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2c700 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2c710 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2c720 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2c730 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2c740 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2c750 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2c760 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2c770 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2c780 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2c790 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2c7a0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2c7b0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2c7c0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2c7d0 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2c7e0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2c7f0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2c800 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2c810 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2c820 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2c830 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2c840 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2c850 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c860 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2c870 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2c880 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2c890 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c8a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c8b0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c8d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c8e0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c8f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c900 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c910 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c920 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c930 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c940 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c950 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c960 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c970 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c980 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c990 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c9a0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2c9b0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2c9c0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2c9d0 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2c9e0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2c9f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2ca00 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2ca20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2ca30 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2ca40 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2ca50 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2ca60 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2ca70 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2ca80 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2ca90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2caa0 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2cab0 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2cac0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2cad0 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2cae0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2caf0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2cb00 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2cb10 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2cb20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2cb30 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2cb40 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2cb50 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb70 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2cb80 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2cb90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2cba0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2cbb0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2cbc0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2cbd0 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2cbe0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2cbf0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2cc00 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2cc10 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2cc20 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2cc30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cc40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2cc50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2cc60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2cc70 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2cc80 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2cc90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2cca0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2ccb0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2ccc0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2ccd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cce0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ccf0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2cd00 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2cd10 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2cd20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2cd30 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2cd40 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2cd50 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2cd60 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2cd70 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2cd80 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2cd90 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2cda0 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2cdb0 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2cdc0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cdd0 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2cde0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2cdf0 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2ce00 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ce10 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2ce20 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2ce30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2ce40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ce50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2ce60 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2ce70 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2ce80 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2ce90 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2cea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2ceb0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2cec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ced0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2cee0 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2cef0 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2cf00 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2cf10 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2cf20 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2cf30 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2cf40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2cf50 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2cf60 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2cf70 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2cf80 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2cf90 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2cfa0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2cfb0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2cfc0 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2cfd0 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2cfe0 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2cff0 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2d000 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d010 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2d020 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2d030 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2d040 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d050 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2d060 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2d070 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d090 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c            getCel
2d0a0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
2d0b0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2d0c0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2d0d0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2d0e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d0f0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2d100 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2d120 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
2d130 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d140 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d150 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2d160 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2d170 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2d180 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2d190 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2d1a0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2d1b0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2d1c0 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2d1d0 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2d1e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2d1f0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2d200 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2d210 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2d220 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2d230 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2d240 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2d250 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2d260 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2d270 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2d280 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2d290 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2d2a0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2d2b0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2d2c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2d2d0 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73  PTY ){.      ass
2d2e0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2d2f0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2d300 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2d310 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2d320 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2d330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d340 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2d350 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d360 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2d370 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2d380 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d390 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d3a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2d3b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2d3c0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2d3d0 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73  Cell > 0 );.  as
2d3e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2d3f0 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  e==0 || pCur->ap
2d400 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2d410 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2d420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d430 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2d440 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2d450 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2d460 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2d470 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2d480 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2d490 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2d4a0 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  ge;.    u8 *pCel
2d4b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d4d0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2d4e0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2d4f0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2d500 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2d510 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2d520 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2d530 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2d540 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2d550 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2d560 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2d570 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2d580 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2d590 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2d5a0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2d5b0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2d5c0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2d5d0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2d5e0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2d5f0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2d600 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2d610 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2d620 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2d630 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2d640 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2d650 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2d660 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2d670 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2d680 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2d690 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2d6a0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2d6b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2d6c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2d6d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2d6e0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2d6f0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2d700 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2d710 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2d720 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2d730 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2d740 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2d750 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2d760 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2d770 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2d780 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2d790 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d7a0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2d7b0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2d7c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2d7d0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2d7e0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2d7f0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2d800 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2d810 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2d820 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d830 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2d840 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2d850 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2d860 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d870 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2d880 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2d890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d8a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2d8b0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2d8c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d8d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d8e0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2d8f0 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2d900 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2d910 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2d920 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d930 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2d940 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2d950 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2d960 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2d970 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2d980 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2d990 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2d9a0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2d9b0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d9c0 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2d9d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d9e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d9f0 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2da00 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2da10 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2da20 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2da30 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2da40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2da50 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2da60 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2da70 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2da80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da90 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2daa0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2dab0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2dac0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2dad0 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2dae0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2daf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2db00 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2db10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2db20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2db30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2db40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2db50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2db60 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2db70 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2db80 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2db90 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2dba0 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2dbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2dbc0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2dbd0 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2dbe0 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2dbf0 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2dc00 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2dc10 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2dc20 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2dc30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2dc40 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2dc50 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2dc60 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2dc70 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2dc80 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2dc90 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2dca0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2dcb0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2dcc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2dcd0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2dce0 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2dcf0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2dd00 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2dd10 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2dd20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2dd30 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2dd40 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2dd50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2dd60 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2dd70 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2dd80 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2dd90 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2dda0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2ddb0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2ddc0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2ddd0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2dde0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2ddf0 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2de00 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2de10 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2de20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2de30 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2de40 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2de50 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2de60 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2de70 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2de80 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2de90 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2dea0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2deb0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2dec0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2ded0 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2dee0 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2def0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2df00 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2df10 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2df20 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2df30 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2df40 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2df50 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2df60 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2df70 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2df80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2df90 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2dfa0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2dfb0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2dfc0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2dfd0 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2dfe0 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2dff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e000 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2e010 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2e020 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2e030 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2e040 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2e050 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2e060 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2e070 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2e080 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2e090 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2e0a0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2e0b0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2e0c0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2e0d0 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2e0e0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2e0f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e100 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2e110 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2e120 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2e130 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2e140 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2e150 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2e160 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2e170 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2e180 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2e190 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2e1a0 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2e1b0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2e1c0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2e1d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2e1e0 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2e1f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2e200 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2e210 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2e220 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2e230 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2e240 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2e250 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2e260 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2e270 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2e280 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2e290 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2e2a0 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2e2b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2e2c0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2e2d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2e2e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2e2f0 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2e300 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2e310 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2e320 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2e330 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2e340 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2e350 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2e360 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2e370 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2e380 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2e390 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2e3a0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2e3b0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2e3c0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2e3d0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2e3e0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2e3f0 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2e400 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2e410 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2e420 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e430 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2e440 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2e450 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2e460 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2e470 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e480 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2e490 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2e4a0 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2e4b0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e4c0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2e4d0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2e4e0 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2e4f0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2e500 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2e510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e520 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2e530 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2e540 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2e550 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2e560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e570 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2e580 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2e590 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2e5a0 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2e5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e5c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e5d0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2e5e0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e5f0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2e600 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2e610 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2e620 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2e630 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2e640 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2e650 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e660 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2e670 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2e680 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2e690 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2e6a0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2e6b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e6c0 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2e6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2e6e0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2e6f0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2e700 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2e710 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2e720 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2e730 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2e740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2e750 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2e760 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2e770 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2e780 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2e790 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2e7a0 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2e7b0 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2e7c0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e7d0 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2e7e0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2e7f0 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2e800 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2e810 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2e820 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2e830 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e840 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2e850 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2e860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e870 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e880 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2e890 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2e8a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e8b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e8c0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e8d0 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2e8e0 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2e8f0 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2e900 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e910 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2e920 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e940 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2e950 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2e960 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2e970 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2e980 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2e990 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2e9a0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2e9b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e9c0 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2e9d0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2e9e0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2e9f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ea00 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2ea10 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2ea20 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2ea30 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2ea40 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2ea50 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2ea60 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2ea70 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2ea80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2ea90 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2eaa0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2eab0 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2eac0 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2ead0 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2eae0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2eaf0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2eb00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2eb10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2eb20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2eb30 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2eb40 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2eb50 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2eb60 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
2eb70 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2eb80 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2eb90 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2eba0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2ebb0 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2ebc0 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2ebd0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2ebe0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ebf0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ec00 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2ec10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ec20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2ec30 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2ec40 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2ec50 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2ec60 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2ec70 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2ec80 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2ec90 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2eca0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2ecb0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2ecc0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2ecd0 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2ece0 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2ecf0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2ed00 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2ed10 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2ed20 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2ed30 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2ed40 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2ed50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2ed60 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2ed70 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ed80 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2ed90 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2eda0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2edb0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2edc0 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2edd0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2ede0 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2edf0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2ee00 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2ee10 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2ee20 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2ee30 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2ee40 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2ee50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ee60 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
2ee70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2ee80 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2ee90 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
2eea0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
2eeb0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2eec0 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
2eed0 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
2eee0 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
2eef0 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2ef00 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2ef10 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ef20 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
2ef30 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
2ef40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ef50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2ef60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ef70 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2ef80 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2ef90 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
2efa0 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
2efb0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2efc0 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
2efd0 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
2efe0 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
2eff0 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
2f000 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
2f010 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
2f020 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
2f030 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
2f040 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2f050 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f060 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
2f070 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
2f080 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
2f090 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
2f0a0 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
2f0b0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
2f0c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
2f0d0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
2f0e0 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
2f0f0 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
2f100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
2f110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2f120 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2f130 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2f140 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2f150 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2f160 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
2f170 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
2f180 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
2f190 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
2f1a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
2f1b0 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
2f1c0 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
2f1d0 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2f1e0 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2f1f0 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2f200 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f210 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f220 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2f230 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2f240 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2f250 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2f260 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2f270 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2f280 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2f290 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2f2a0 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2f2b0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2f2c0 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2f2d0 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2f2e0 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2f2f0 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2f300 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2f310 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2f320 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2f330 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2f340 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
2f350 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
2f360 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
2f370 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
2f380 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
2f390 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
2f3a0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2f3b0 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2f3c0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2f3d0 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2f3e0 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2f3f0 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2f400 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2f410 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
2f420 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2f430 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
2f440 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2f450 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2f460 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
2f470 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2f480 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2f490 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2f4a0 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2f4b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f4c0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2f4d0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2f4e0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2f4f0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2f500 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2f510 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2f520 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2f530 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2f540 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
2f550 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f560 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2f570 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f580 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2f590 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2f5a0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2f5b0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2f5c0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2f5d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f5e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f5f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2f600 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2f610 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2f620 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f630 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2f640 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f650 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2f660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2f670 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2f680 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2f690 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2f6a0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2f6b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2f6c0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2f6d0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2f6e0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
2f6f0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2f700 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2f710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f720 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2f730 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2f740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2f750 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f760 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2f770 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61 67  >ix;.  if( !pPag
2f780 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
2f790 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f   /* The only kno
2f7a0 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73 20  wn way for this 
2f7b0 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f 72  to happen is for
2f7c0 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a 20   there to be a. 
2f7d0 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
2f7e0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
2f7f0 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45 20  t does a DELETE 
2f800 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61 72  operation as par
2f810 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53 45  t of a.    ** SE
2f820 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c 65 74  LECT which delet
2f830 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 66  es content out f
2f840 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63 74  rom under an act
2f850 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  ive cursor.    *
2f860 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2f870 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
2f880 72 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  re the table bei
2f890 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72 6f  ng DELETE-ed fro
2f8a0 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61 67  m.    ** has pag
2f8b0 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74  es in common wit
2f8c0 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
2f8d0 67 20 71 75 65 72 69 65 64 2e 20 20 53 65 65 20  g queried.  See 
2f8e0 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c  TH3.    ** modul
2f8f0 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e 74  e cov1/btree78.t
2f900 65 73 74 20 74 65 73 74 63 61 73 65 20 32 32 30  est testcase 220
2f910 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66 6f   (2018-06-08) fo
2f920 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61 6d  r an.    ** exam
2f930 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ple. */.    retu
2f940 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f950 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
2f960 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2f970 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2f980 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2f990 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2f9a0 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2f9b0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2f9c0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2f9d0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2f9e0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2f9f0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2fa00 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2fa10 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2fa20 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2fa30 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2fa40 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2fa50 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2fa60 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2fa70 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2fa80 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2fa90 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2faa0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2fab0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2fac0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2fad0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2fae0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2faf0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fb00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2fb10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fb20 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2fb30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2fb40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2fb50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2fb60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2fb70 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2fb80 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2fb90 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2fba0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2fbb0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2fbc0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2fbd0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2fbe0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fbf0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2fc00 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2fc10 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2fc20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2fc30 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
2fc40 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d  hile( pCur->ix>=
2fc50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2fc60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2fc70 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2fc80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2fc90 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2fca0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fcb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fcc0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2fcd0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2fce0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2fcf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2fd00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2fd10 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2fd20 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2fd30 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2fd40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2fd50 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50  t flags){.  MemP
2fd60 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e  age *pPage;.  UN
2fd70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
2fd80 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
2fd90 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
2fda0 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
2fdb0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63  e */.  assert( c
2fdc0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2fdd0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2fde0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
2fdf0 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
2fe00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2fe10 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2fe20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2fe30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
2fe40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2fe50 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2fe60 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2fe70 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2fe80 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43  dOvfl);.  if( pC
2fe90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2fea0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2feb0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2fec0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2fed0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2fee0 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
2fef0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2ff00 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
2ff10 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2ff20 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
2ff30 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ff40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ff50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ff60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2ff70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2ff80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ff90 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2ffa0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2ffb0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2ffc0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2ffd0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
2ffe0 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
2fff0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
30000 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
30010 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
30020 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
30030 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
30040 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
30050 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
30060 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
30070 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
30080 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
30090 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
300a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
300b0 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
300c0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
300d0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
300e0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
300f0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
30100 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
30110 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
30120 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
30130 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
30140 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
30150 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
30160 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
30170 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
30180 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
30190 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
301a0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
301b0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
301c0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
301d0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
301e0 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
301f0 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
30200 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
30210 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
30220 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
30230 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
30240 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
30250 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
30260 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
30270 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
30280 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
30290 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
302a0 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
302b0 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
302c0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
302d0 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
302e0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
302f0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
30300 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
30310 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
30320 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
30330 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
30340 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
30350 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30360 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
30370 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
30380 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
30390 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
303a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
303b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
303c0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
303d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
303e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
303f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30400 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30410 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30420 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
30430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30440 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
30450 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
30460 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
30470 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
30480 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
30490 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
304a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
304b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
304c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
304d0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
304e0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
304f0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
30500 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
30510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
30520 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
30530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
30540 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
30550 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
30560 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
30570 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
30580 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
30590 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
305a0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
305b0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
305c0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
305d0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
305e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
305f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
30600 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
30610 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
30620 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30630 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
30640 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
30650 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
30660 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
30670 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a  idx = pCur->ix;.
30680 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
30690 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
306a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
306b0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
306c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
306d0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
306e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
306f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
30700 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78   while( pCur->ix
30710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30720 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
30730 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
30740 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
30750 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
30760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30770 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
30780 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
30790 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
307a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
307b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
307c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
307d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
307e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
307f0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
30800 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67  ->ix--;.    pPag
30810 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
30820 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
30830 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
30840 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
30850 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
30860 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
30870 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
30880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30890 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
308a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
308b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
308c0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
308d0 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
308e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
308f0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
30900 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
30910 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
30920 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  lags==1 );.  ass
30930 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
30940 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
30950 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
30960 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44  ALID );.  UNUSED
30970 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
30980 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
30990 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
309a0 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
309b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
309c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
309d0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
309e0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
309f0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
30a00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
30a10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
30a20 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
30a30 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
30a40 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
30a50 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
30a60 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
30a70 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
30a80 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
30a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
30ab0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
30ac0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
30ad0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
30ae0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
30af0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
30b00 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
30b10 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
30b20 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
30b30 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
30b40 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
30b50 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
30b60 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
30b70 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
30b80 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
30b90 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
30ba0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
30bb0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
30bc0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
30bd0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
30be0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
30bf0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
30c00 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
30c10 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
30c20 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
30c30 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
30c40 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
30c50 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
30c60 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
30c70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
30c80 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
30c90 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
30ca0 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
30cb0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
30cc0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
30cd0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30ce0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
30cf0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
30d00 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
30d10 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
30d20 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
30d30 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
30d40 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
30d50 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
30d60 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
30d70 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
30d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
30d90 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
30da0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
30db0 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
30dc0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
30dd0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
30de0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
30df0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
30e00 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
30e10 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
30e20 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
30e30 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
30e40 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
30e50 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
30e60 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
30e70 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
30e80 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
30e90 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
30ea0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
30eb0 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
30ec0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
30ed0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
30ee0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
30ef0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
30f00 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
30f10 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
30f20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
30f30 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
30f40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30f50 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
30f60 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
30f70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
30f80 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
30f90 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
30fa0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
30fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
30fc0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
30fd0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
30fe0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
30ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
31000 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
31010 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
31020 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
31030 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
31040 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
31050 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
31060 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
31070 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
31080 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
31090 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
310a0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
310b0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
310c0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
310d0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
310e0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
310f0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
31100 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
31110 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31120 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
31130 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31140 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31150 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
31160 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
31170 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
31180 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
31190 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
311a0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
311b0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
311c0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
311d0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
311e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
311f0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
31200 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
31210 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
31220 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
31230 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
31240 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
31250 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31260 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
31270 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31280 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
31290 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
312a0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
312b0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
312c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
312d0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
312e0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
312f0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
31300 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
31310 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
31320 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
31330 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
31340 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
31350 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
31360 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
31370 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
31380 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
31390 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
313a0 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
313b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
313c0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
313d0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
313e0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
313f0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
31400 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
31410 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
31420 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
31430 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
31440 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
31450 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
31460 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
31470 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
31480 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
31490 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
314a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
314b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
314c0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
314d0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
314e0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
314f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
31500 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
31510 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
31520 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31530 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
31540 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
31550 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
31560 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
31570 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
31580 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31590 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
315a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
315b0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
315c0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
315d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
315e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
315f0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31600 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
31610 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
31620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
31630 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
31640 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
31650 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
31660 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
31670 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
31680 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
31690 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
316a0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
316b0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
316c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
316d0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
316e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
316f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31700 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31710 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31720 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
31730 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
31740 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
31750 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
31760 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
31770 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
31780 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
31790 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
317a0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
317b0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
317c0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
317d0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
317e0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
317f0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
31800 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
31810 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
31820 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
31830 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
31840 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
31850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
31860 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
31870 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
31880 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
31890 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
318a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
318b0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
318c0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
318d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
318e0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
318f0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
31900 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
31910 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
31920 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
31930 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
31940 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
31950 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
31960 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
31970 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
31980 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
31990 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
319a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
319b0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
319c0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
319d0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
319e0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
319f0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
31a00 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
31a10 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31a20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
31a30 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
31a40 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
31a50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
31a60 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
31a70 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
31a80 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
31a90 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
31aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31ab0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
31ac0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
31ad0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
31ae0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
31af0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
31b00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31b10 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
31b20 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
31b30 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
31b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31b50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31b60 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
31b70 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
31b80 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
31b90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31ba0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
31bb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31bc0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
31be0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
31bf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31c00 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
31c10 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
31c20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
31c30 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
31c40 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
31c50 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31c60 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
31c70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
31c80 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
31c90 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
31ca0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
31cb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31cc0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
31cd0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
31ce0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
31cf0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
31d00 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
31d10 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
31d20 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
31d30 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
31d40 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
31d50 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
31d60 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
31d70 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
31d80 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
31d90 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
31da0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
31db0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31dc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31dd0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
31de0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
31df0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31e00 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31e10 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31e20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
31e30 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
31e40 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
31e50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
31e60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31e70 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
31e80 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
31e90 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
31ea0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
31eb0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
31ec0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
31ed0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
31ee0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
31ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
31f00 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
31f10 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
31f20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
31f30 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
31f40 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
31f50 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
31f60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31f70 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
31f80 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
31f90 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31fa0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
31fb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
31fc0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
31fd0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
31fe0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
31ff0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
32000 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
32010 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32020 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
32030 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
32040 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
32050 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
32060 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
32070 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
32080 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
32090 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
320a0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
320b0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
320c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
320d0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
320e0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
320f0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
32100 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32130 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32140 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32150 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
32160 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32170 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
32180 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
32190 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
321a0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
321b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
321c0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
321d0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
321e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
321f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32210 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32220 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
32230 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32260 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32270 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32290 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
322a0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
322b0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
322c0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
322d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
322e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
322f0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
32300 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
32310 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32320 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32330 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
32340 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
32350 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
32360 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
32370 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
32380 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32390 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
323a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
323b0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
323c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
323d0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
323e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
323f0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
32400 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
32410 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32420 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
32440 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
32450 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32460 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32470 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32480 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32490 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
324a0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
324b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
324c0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
324d0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
324e0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
324f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32500 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32510 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32520 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32550 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
32560 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32570 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32590 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
325a0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
325b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
325c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
325d0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
325e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
325f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32600 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
32610 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32620 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32630 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32640 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
32650 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32660 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
32670 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
32680 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
32690 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
326a0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
326b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
326c0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
326d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
326e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
326f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32700 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
32710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32720 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32730 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
32740 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32760 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32770 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
32780 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32790 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
327a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
327b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
327c0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
327d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
327e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
327f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32800 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
32810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32830 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
32840 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
32850 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
32860 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
32870 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
32880 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
32890 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
328a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
328b0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
328c0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
328d0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
328e0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
328f0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
32900 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32910 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
32920 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
32930 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
32940 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
32950 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
32960 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32970 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
32980 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
32990 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
329a0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
329b0 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
329c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
329d0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
329e0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
329f0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
32a00 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
32a10 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
32a20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
32a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
32a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32a50 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32a60 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
32a70 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
32a80 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
32a90 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
32aa0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
32ab0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
32ac0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
32ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
32ae0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
32af0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
32b00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
32b10 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
32b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32b30 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32b50 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
32b60 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
32b70 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
32b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32ba0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
32bb0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
32bc0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
32bd0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
32be0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
32bf0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
32c00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32c10 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
32c20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32c30 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
32c40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32c50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
32c60 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
32c70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32c80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32ca0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32cb0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32cc0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
32cd0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
32ce0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
32cf0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
32d00 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
32d10 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
32d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
32d30 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
32d40 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
32d50 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
32d60 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32d70 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
32d80 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
32d90 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
32da0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
32db0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dd0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
32de0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
32df0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
32e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32e10 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32e20 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32e30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32e40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32e50 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32e60 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
32e70 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
32e80 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
32e90 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
32ea0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
32eb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32ec0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32ed0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
32ee0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
32ef0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
32f00 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32f10 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
32f20 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
32f30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32f40 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32f50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
32f60 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
32f70 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
32f80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32f90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32fb0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
32fc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32fd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32ff0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
33000 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33020 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33050 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
33060 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33070 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
33080 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
33090 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
330a0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
330b0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
330c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
330d0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
330e0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
330f0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
33100 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
33110 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33120 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33130 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
33140 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
33150 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
33160 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
33170 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
33180 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
33190 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
331a0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
331b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
331c0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
331d0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
331e0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
331f0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
33200 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
33210 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33220 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33230 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
33240 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
33250 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
33260 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
33270 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
33280 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
33290 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
332a0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
332b0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
332c0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
332d0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
332e0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
332f0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
33300 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
33310 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33320 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33330 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
33340 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
33350 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
33360 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
33370 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
33380 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
33390 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
333a0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
333b0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
333c0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
333d0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
333e0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
333f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33400 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33410 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33420 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33430 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
33440 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
33450 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
33460 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
33470 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
33480 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
33490 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
334a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
334b0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
334c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
334d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
334e0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
334f0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33500 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33510 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33520 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33540 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
33550 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33560 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33570 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
33580 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
33590 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
335a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
335b0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
335c0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
335d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
335e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
335f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33600 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33610 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33620 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33630 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
33640 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
33650 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
33660 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
33670 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
33680 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
33690 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
336a0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
336b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
336c0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
336d0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
336e0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
336f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33700 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33710 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33720 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33730 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33740 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
33750 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
33760 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
33770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33780 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
33790 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
337a0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
337b0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
337c0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
337d0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
337e0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
337f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33800 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
33810 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33820 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
33830 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33840 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
33850 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
33860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33870 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33880 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
33890 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
338a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
338b0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
338c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
338d0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
338e0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
338f0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
33900 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
33910 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
33920 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
33930 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33940 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
33950 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
33960 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
33970 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
33980 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
33990 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
339a0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
339b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
339c0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
339d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
339e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
339f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
33a00 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
33a10 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
33a20 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
33a30 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
33a40 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
33a50 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
33a60 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
33a70 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33a80 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
33a90 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
33aa0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
33ab0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
33ac0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
33ad0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33ae0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
33af0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33b00 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
33b10 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
33b20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33b30 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
33b40 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
33b50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33b60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33b70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
33b80 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
33b90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33ba0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
33bb0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
33bc0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
33bd0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
33be0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
33bf0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
33c00 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
33c10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
33c20 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
33c30 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
33c40 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
33c50 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
33c60 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
33c70 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
33c80 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
33c90 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
33ca0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
33cb0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
33cc0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
33cd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
33ce0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
33cf0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
33d00 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
33d10 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
33d20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33d30 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
33d40 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33d50 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
33d60 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
33d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
33d80 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
33d90 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
33da0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
33db0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
33dc0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33de0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
33df0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
33e00 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
33e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33e20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
33e30 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
33e40 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
33e50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
33e60 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
33e70 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
33e80 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
33e90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
33ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33eb0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
33ec0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
33ed0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
33ee0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
33ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f00 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
33f10 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
33f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
33f40 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
33f50 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
33f60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
33f70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33f80 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33f90 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
33fa0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
33fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
33fc0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
33fd0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
33fe0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
33ff0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
34000 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34010 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
34020 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
34030 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
34040 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
34050 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
34060 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
34070 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
34080 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
34090 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
340a0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
340b0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
340c0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
340d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
340e0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
340f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34100 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34110 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
34120 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34130 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
34140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34150 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
34160 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
34170 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
34180 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
34190 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
341a0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
341b0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
341c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
341d0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
341e0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
341f0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
34200 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
34210 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
34220 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34230 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
34240 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
34250 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
34260 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34270 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
34280 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
34290 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
342a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
342b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
342c0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
342d0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
342e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
342f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34300 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34310 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
34320 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
34330 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
34340 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
34350 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
34360 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
34370 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
34380 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
34390 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
343a0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
343b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
343c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
343d0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
343e0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
343f0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
34400 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
34410 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
34420 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
34430 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
34440 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
34450 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
34460 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
34470 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
34480 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
34490 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
344a0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
344b0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
344c0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
344d0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
344e0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
344f0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
34500 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
34510 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
34520 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
34530 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
34540 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
34550 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
34560 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
34570 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
34580 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
34590 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
345a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
345b0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
345c0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
345d0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
345e0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
345f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34600 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
34610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34620 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
34630 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
34640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34650 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
34660 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
34670 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
34680 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
34690 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
346a0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
346b0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
346c0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
346d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
346e0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
346f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34700 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
34710 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34720 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
34730 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
34740 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
34750 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
34760 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
34770 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
34780 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
34790 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
347a0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
347b0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
347c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
347d0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
347e0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
347f0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
34800 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
34810 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
34820 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
34830 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
34840 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
34850 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
34860 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
34870 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
34880 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
34890 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
348a0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
348b0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
348c0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
348d0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
348e0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
348f0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
34900 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
34910 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
34920 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
34930 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
34940 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
34950 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
34960 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
34970 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
34980 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
34990 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
349a0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
349b0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
349c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
349d0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
349e0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
349f0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
34a00 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
34a10 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
34a20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
34a30 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
34a40 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
34a50 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
34a60 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
34a70 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
34a80 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
34a90 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
34aa0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
34ab0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
34ac0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
34ad0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
34ae0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
34af0 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
34b00 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
34b10 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
34b20 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
34b30 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34b40 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
34b50 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
34b60 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
34b70 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
34b80 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34b90 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
34ba0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
34bb0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34bc0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
34bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34be0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
34bf0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34c00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
34c20 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34c30 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
34c40 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
34c50 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34c60 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
34c70 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
34c80 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
34c90 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34ca0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34cb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34cc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
34cd0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
34ce0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
34cf0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
34d00 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
34d10 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
34d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
34d30 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
34d40 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
34d50 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
34d60 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
34d70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
34d80 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34da0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
34db0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
34dc0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
34dd0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
34de0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
34df0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
34e00 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
34e10 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
34e20 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
34e30 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
34e40 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
34e50 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
34e60 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
34e70 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
34e80 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
34e90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
34ea0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
34eb0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
34ec0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
34ed0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
34ee0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34ef0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
34f00 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
34f10 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
34f20 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
34f30 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
34f40 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
34f50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
34f60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
34f70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34f80 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
34fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34fb0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34fc0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
34fd0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
34fe0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
34ff0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
35000 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
35010 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
35020 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
35030 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
35040 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
35050 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
35060 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
35070 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
35080 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
35090 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
350a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
350b0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
350c0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
350d0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
350e0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
350f0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
35100 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
35110 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
35120 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
35130 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
35140 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
35150 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
35160 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
35170 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
35180 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
35190 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
351a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
351b0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53  e given Cell.  S
351c0 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66  tore.** size inf
351d0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
351e0 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f  he cell in pInfo
351f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35200 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
35210 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
35220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35230 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
35240 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
35250 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
35260 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
35270 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
35280 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
35290 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
352a0 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
352b0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
352c0 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
352d0 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
352e0 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
352f0 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
35300 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
35310 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
35320 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35330 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35340 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
35350 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
35360 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
35370 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
35380 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
35390 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
353a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
353b0 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
353c0 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
353d0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
353e0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74  thing */.  }.  t
353f0 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
35400 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d   pInfo->nSize ==
35410 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
35420 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
35430 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  pCell + (pInfo->
35440 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67  nSize-1) == pPag
35450 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
35460 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e   if( pCell + pIn
35470 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67  fo->nSize > pPag
35480 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
35490 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e     /* Cell exten
354a0 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
354b0 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  age */.    retur
354c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
354d0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
354e0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
354f0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20  et4byte(pCell + 
35500 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34  pInfo->nSize - 4
35510 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
35520 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
35530 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
35540 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
35550 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
35560 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
35570 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e  nOvfl = (pInfo->
35580 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f  nPayload - pInfo
35590 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  ->nLocal + ovflP
355a0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
355b0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
355c0 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
355d0 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
355e0 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79   && (pInfo->nPay
355f0 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53  load + ovflPageS
35600 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a  ize)<ovflPageSiz
35610 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  e).  );.  while(
35620 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
35630 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
35640 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
35650 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
35660 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
35670 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
35680 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
35690 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
356a0 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
356b0 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
356c0 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
356d0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
356e0 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
356f0 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
35700 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35710 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
35720 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
35730 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
35740 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
35750 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35760 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
35770 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
35780 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
35790 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
357a0 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
357b0 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
357c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
357d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
357e0 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
357f0 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
35800 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
35810 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
35820 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
35830 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
35840 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
35850 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
35860 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
35870 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
35880 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
35890 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
358a0 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
358b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
358c0 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
358d0 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
358e0 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
358f0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
35900 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
35910 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
35920 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
35930 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
35940 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
35950 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
35960 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
35970 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
35980 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
35990 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
359a0 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
359b0 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
359c0 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
359d0 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
359e0 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
359f0 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
35a00 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
35a10 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
35a20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
35a30 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
35a40 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
35a50 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
35a60 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
35a70 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
35a80 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
35a90 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
35aa0 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
35ab0 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
35ac0 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
35ad0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
35ae0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35af0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35b00 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
35b10 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
35b20 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
35b30 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
35b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
35b50 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
35b60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
35b70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35b80 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
35b90 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
35ba0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35bb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
35bc0 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
35bd0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
35be0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
35bf0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
35c00 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
35c10 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
35c20 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
35c30 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
35c40 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
35c50 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
35c60 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
35c70 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
35c80 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
35c90 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
35ca0 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
35cb0 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
35cc0 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
35cd0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
35ce0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
35cf0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
35d00 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
35d10 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
35d20 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
35d30 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
35d40 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
35d50 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
35d60 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
35d70 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
35d80 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
35d90 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
35da0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
35db0 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
35dc0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
35dd0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
35de0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
35df0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
35e00 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
35e10 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
35e20 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
35e30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
35e40 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
35e50 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
35e60 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20  st BtreePayload 
35e70 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  *pX,        /* P
35e80 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63  ayload with whic
35e90 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  h to construct t
35ea0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
35eb0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
35ed0 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
35ee0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
35ef0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
35f00 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
35f10 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d  t nSrc, n, rc, m
35f20 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  n;.  int spaceLe
35f30 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
35f40 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73  ToRelease;.  uns
35f50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
35f60 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
35f70 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
35f80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
35f90 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b    Pgno pgnoOvfl;
35fa0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
35fb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35fc0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35fd0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35fe0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
35ff0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
36000 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
36010 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
36020 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
36030 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
36040 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
36050 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
36060 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
36070 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
36080 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
36090 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
360a0 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  a[pPage->pBt->pa
360b0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
360c0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
360d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
360e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
360f0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
36100 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
36110 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
36120 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
36130 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
36140 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c  Key ){.    nPayl
36150 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20  oad = pX->nData 
36160 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20  + pX->nZero;.   
36170 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74   pSrc = pX->pDat
36180 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58  a;.    nSrc = pX
36190 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->nData;.    ass
361a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
361b0 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c  eyLeaf ); /* fil
361c0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63  lInCell() only c
361d0 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73  alled for leaves
361e0 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20   */.    nHeader 
361f0 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
36200 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36210 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e  nPayload);.    n
36220 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
36230 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
36240 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d  er], *(u64*)&pX-
36250 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
36260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
36270 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66  >nKey<=0x7ffffff
36280 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30  f && pX->pKey!=0
36290 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e   );.    nSrc = n
362a0 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70  Payload = (int)p
362b0 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  X->nKey;.    pSr
362c0 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20  c = pX->pKey;.  
362d0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
362e0 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
362f0 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
36300 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ad);.  }.  .  /*
36310 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
36320 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f  load */.  pPaylo
36330 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
36340 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79  der];.  if( nPay
36350 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
36360 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
36370 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d  This is the comm
36380 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76  on case where ev
36390 65 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e  erything fits on
363a0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a   the btree page.
363b0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76      ** and no ov
363c0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
363d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
363e0 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
363f0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
36400 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
36410 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
36420 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
36430 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
36440 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
36450 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50  assert( nSrc<=nP
36460 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65  ayload );.    te
36470 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61  stcase( nSrc<nPa
36480 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d  yload );.    mem
36490 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
364a0 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d  rc, nSrc);.    m
364b0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e  emset(pPayload+n
364c0 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64  Src, 0, nPayload
364d0 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75  -nSrc);.    retu
364e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
364f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
36500 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
36510 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  it means that so
36520 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  me of the conten
36530 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a  t will need.  **
36540 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f   to spill onto o
36550 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
36560 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65   */.  mn = pPage
36570 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20  ->minLocal;.  n 
36580 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
36590 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
365a0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
365b0 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73   - 4);.  testcas
365c0 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
365d0 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
365e0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
365f0 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
36600 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
36610 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
36620 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e  .  spaceLeft = n
36630 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20  ;.  *pnSize = n 
36640 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
36650 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
36660 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70  [nHeader+n];.  p
36670 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
36680 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
36690 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
366a0 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  t;..  /* At this
366b0 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
366c0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
366d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
366e0 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
366f0 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
36700 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
36710 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
36720 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
36730 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
36740 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
36750 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
36760 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
36770 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
36780 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
36790 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
367a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367b0 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
367c0 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
367d0 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
367e0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
367f0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
36800 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
36810 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
36820 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
36830 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
36840 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
36850 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
36860 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
36870 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
36880 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
36890 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
368a0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
368b0 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
368c0 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
368d0 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
368e0 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
368f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
36900 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
36910 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
36920 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
36930 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
36940 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
36950 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
36960 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
36970 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
36980 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
36990 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
369a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
369b0 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
369c0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
369d0 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
369e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
369f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
36a00 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
36a10 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
36a20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
36a30 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
36a40 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
36a50 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e( 1 ){.    n = 
36a60 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
36a70 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
36a80 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
36a90 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
36aa0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
36ab0 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
36ac0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
36ad0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
36ae0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
36af0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
36b00 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
36b10 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
36b20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
36b30 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
36b40 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36b50 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
36b60 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
36b70 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
36b80 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
36b90 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
36ba0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
36bb0 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
36bc0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
36bd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
36be0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
36bf0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
36c00 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
36c10 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
36c20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
36c30 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36c40 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36c50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
36c60 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20   nSrc>=n ){.    
36c70 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36c80 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
36c90 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e   }else if( nSrc>
36ca0 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e  0 ){.      n = n
36cb0 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Src;.      memcp
36cc0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
36cd0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
36ce0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
36cf0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
36d00 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
36d10 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  d -= n;.    if( 
36d20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72  nPayload<=0 ) br
36d30 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  eak;.    pPayloa
36d40 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
36d50 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
36d60 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
36d70 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
36d80 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
36d90 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
36da0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e  *pOvfl = 0;.#ifn
36db0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36dc0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
36dd0 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
36de0 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
36df0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
36e00 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
36e10 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
36e20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36e30 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
36e40 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
36e50 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
36e60 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
36e70 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
36e80 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
36e90 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
36ea0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36eb0 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
36ec0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36ed0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
36ee0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36ef0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
36f00 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
36f10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36f20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36f30 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36f40 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
36f50 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
36f60 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
36f70 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
36f80 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
36f90 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
36fa0 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
36fb0 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
36fc0 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
36fd0 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
36fe0 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
36ff0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
37000 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
37010 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
37020 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
37030 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
37040 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
37050 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
37060 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
37070 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
37080 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
37090 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
370a0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
370b0 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
370c0 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
370d0 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
370e0 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
370f0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
37100 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
37110 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
37120 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
37130 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
37150 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
37160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37170 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
37180 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
37190 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
371a0 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
371b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
371c0 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
371d0 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
371e0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
371f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
37200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
37210 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
37220 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37230 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
37240 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
37250 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
37260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
37270 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
37280 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
37290 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
372a0 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
372b0 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
372c0 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
372d0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
372e0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
372f0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
37300 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
37310 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
37320 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
37330 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37340 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
37350 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
37360 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
37370 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
37380 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
37390 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
373a0 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
373b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
373c0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
373d0 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
373e0 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
373f0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
37400 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
37410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
37420 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37430 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
37440 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
37450 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
37460 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
37470 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
37480 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
37490 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
374a0 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
374b0 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
374c0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
374d0 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
374e0 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
374f0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
37500 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
37510 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
37520 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   - 4;.    }.  }.
37530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
37540 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
37550 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37560 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
37570 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
37580 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
37590 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
375a0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
375b0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
375c0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
375d0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
375e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
375f0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
37600 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
37610 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
37620 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
37630 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
37640 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
37650 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
37660 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
37670 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
37680 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
37690 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
376a0 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
376b0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
376c0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
376d0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
376e0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
376f0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
37700 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
37710 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
37720 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
37730 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
37740 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
37750 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
37760 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
37770 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
37780 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
37790 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
377a0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
377b0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
377c0 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
377d0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
377e0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
377f0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
37800 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
37810 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
37820 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
37830 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
37840 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
37850 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
37860 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
37870 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37880 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
37890 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
378a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
378b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
378c0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
378d0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
378e0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
378f0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
37900 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
37910 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
37920 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
37930 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
37940 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
37950 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
37960 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
37970 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
37980 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37990 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 2b  ize );.  if( pc+
379a0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
379b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
379c0 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
379d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
379e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
379f0 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
37a00 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
37a10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37a20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
37a30 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
37a40 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
37a50 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
37a60 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
37a70 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
37a80 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
37a90 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
37aa0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
37ab0 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
37ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
37ad0 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
37ae0 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
37af0 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
37b00 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
37b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
37b30 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
37b40 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
37b50 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
37b60 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
37b70 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
37b80 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
37b90 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
37ba0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
37bb0 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
37bc0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
37bd0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
37be0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
37bf0 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
37c00 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
37c10 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
37c20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
37c30 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
37c40 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
37c50 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
37c60 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
37c70 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
37c80 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
37c90 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37ca0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
37cb0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
37cc0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
37cd0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
37ce0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
37cf0 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
37d00 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
37d10 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
37d20 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
37d30 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
37d40 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
37d50 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
37d60 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
37d70 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
37d80 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
37d90 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
37da0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
37db0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37dc0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
37dd0 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74  .**.** *pRC must
37de0 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68   be SQLITE_OK wh
37df0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
37e00 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
37e10 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
37e20 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
37e30 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
37e40 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
37e50 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
37e60 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
37e70 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
37e80 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
37e90 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
37ea0 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
37eb0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
37ec0 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
37ed0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
37ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
37ef0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
37f00 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
37f10 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
37f20 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
37f30 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
37f40 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
37f50 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37f60 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
37f70 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
37f80 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
37f90 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
37fa0 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
37fb0 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
37fc0 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
37fd0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
37fe0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
37ff0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
38000 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
38010 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
38020 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
38030 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
38040 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
38050 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
38060 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
38070 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
38080 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20  u8 *pIns;       
38090 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
380a0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  n pPage->aCellId
380b0 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c  x[] where no cel
380c0 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  l inserted */.. 
380d0 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53   assert( *pRC==S
380e0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
380f0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
38100 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
38110 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
38120 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
38130 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
38140 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
38150 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
38160 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
38170 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
38180 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
38190 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
381a0 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
381b0 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
381c0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
381d0 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
381e0 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
381f0 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
38200 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38210 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
38220 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
38230 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
38240 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
38250 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
38260 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
38270 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
38280 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
38290 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
382a0 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
382b0 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
382c0 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
382d0 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
382e0 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
382f0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
38300 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
38310 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
38320 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
38330 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
38340 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
38350 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
38360 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
38370 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
38380 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
38390 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
383a0 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78  rt( sz==pPage->x
383b0 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
383c0 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38  pCell) || (sz==8
383d0 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b   && iChild>0) );
383e0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
383f0 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
38400 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
38410 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
38420 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
38430 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  emp, pCell