/ Hex Artifact Content
Login

Artifact 3ae6aea66cc4e13d30162ff0d0d43c7088e34abf:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74  Bt->mutex);.}.st
3ba0: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f  atic int cursorO
3bb0: 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75  wnsBtShared(BtCu
3bc0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
3bd0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3be0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
3bf0: 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e  urn (p->pBtree->
3c00: 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b  db==p->pBt->db);
3c10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3c20: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3c30: 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f  overflow cache o
3c40: 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  f the cursor pas
3c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3c60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e   argument..** on
3c70: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3c80: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61  .*/.#define inva
3ca0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3cb0: 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d  che(pCur) (pCur-
3cc0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
3cd0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f  CF_ValidOvfl)../
3ce0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3cf0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3d00: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3d10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3d20: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
3d30: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3d40: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3d60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
3d70: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
3d80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3d90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3dc0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3dd0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3de0: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3df0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3e00: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
3e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e20: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54  INCRBLOB./*.** T
3e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e40: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3e50: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3e60: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
3e70: 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
3e80: 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
3e90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f  rsors that are o
3ea0: 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f  pen on the.** ro
3eb0: 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  w or one of the 
3ec0: 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66  rows being modif
3ed0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ied..**.** If ar
3ee0: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3ef0: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
3f00: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  n the entire con
3f10: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
3f20: 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74  table is about t
3f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e  o be deleted. In
3f40: 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c   this case inval
3f50: 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c  idate all incrbl
3f60: 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  ob.** cursors op
3f70: 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69  en on any row wi
3f80: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77  thin the table w
3f90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67  ith root-page pg
3fa0: 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  noRoot..**.** Ot
3fb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75  herwise, if argu
3fc0: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3fd0: 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  e is false, then
3fe0: 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a   the row with.**
3ff0: 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62   rowid iRow is b
4000: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72  eing replaced or
4010: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
4020: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
4030: 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20  e.** only those 
4040: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
4050: 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70   open on that sp
4060: 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73  ecific row..*/.s
4070: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
4080: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
4090: 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70  sors(.  Btree *p
40a0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Btree,          
40b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
40c0: 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
40d0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4100: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4110: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4120: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4130: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4140: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4150: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4160: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4170: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4180: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
41a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
41b0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
41c0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
41d0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
41e0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
41f0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4210: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4220: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4230: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4240: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4250: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4260: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c   isClearTable ||
4270: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
4280: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Row ){.        p
4290: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
42a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
42c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
42d0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
42e0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
42f0: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4300: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4310: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4330: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4340: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4350: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4360: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4370: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4380: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
4390: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
43a0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
43b0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
43c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
43d0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
43e0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
43f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4400: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4410: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4420: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4430: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4440: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4450: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4460: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4470: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4480: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
4490: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
44a0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
44b0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
44c0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
44d0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
44e0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
44f0: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4500: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4510: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4520: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4530: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4540: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4550: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4560: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4570: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4580: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
4590: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
45a0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
45b0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
45c0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
45d0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
45e0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
45f0: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4600: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4610: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4620: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4640: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4650: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4660: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4670: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4680: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
4690: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
46a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
46b0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
46c0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
46d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
46e0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
46f0: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4700: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4710: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4720: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4730: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4740: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4750: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4760: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4770: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4780: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
4790: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
47a0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
47b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
47c0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
47d0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
47e0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
47f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4800: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4810: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4820: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4830: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4840: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4850: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4860: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4870: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4880: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
4890: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
48a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
48b0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
48c0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
48d0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
48e0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
48f0: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4900: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4910: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4920: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4930: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4940: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4950: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4970: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4980: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
4990: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
49a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
49b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
49c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
49d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
49e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
49f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4a00: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4a10: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4a20: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4a30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4a40: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4a50: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4a60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4a90: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
4ab0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
4ac0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
4ad0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
4ae0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4af0: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4b00: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4b10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
4b30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
4b40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4b50: 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74  K && pgno<=sqlit
4b60: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74  e3BitvecSize(pBt
4b70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29  ->pHasContent) )
4b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4b90: 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d  e3BitvecSet(pBt-
4ba0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67  >pHasContent, pg
4bb0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
4bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  n rc;.}../*.** Q
4bd0: 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65  uery the BtShare
4be0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65  d.pHasContent ve
4bf0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ctor..**.** This
4c00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4c10: 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d  led when a free-
4c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
4c30: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
4c40: 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  he.** free-list 
4c50: 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65  for reuse. It re
4c60: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69  turns false if i
4c70: 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74  t is safe to ret
4c80: 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67  rieve the.** pag
4c90: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
4ca0: 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
4cb0: 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
4cc0: 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65  g set. True othe
4cd0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
4ce0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73   int btreeGetHas
4cf0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4d10: 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d  ){.  Bitvec *p =
4d20: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4d30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  t;.  return (p &
4d40: 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42  & (pgno>sqlite3B
4d50: 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20  itvecSize(p) || 
4d60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
4d70: 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a  t(p, pgno)));.}.
4d80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65  ./*.** Clear (de
4d90: 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61  stroy) the BtSha
4da0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4db0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f  bitvec. This sho
4dc0: 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65  uld be.** invoke
4dd0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
4de0: 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74  ion of each writ
4df0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e10: 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
4e20: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
4e40: 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70  ecDestroy(pBt->p
4e50: 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70  HasContent);.  p
4e60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e70: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
4e80: 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  lease all of the
4e90: 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20   apPage[] pages 
4ea0: 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4ec0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
4ed0: 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72  orPages(BtCursor
4ee0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
4ef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
4f00: 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
4f10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
4f20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4f30: 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  i]);.    pCur->a
4f40: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4f50: 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  }.  pCur->iPage 
4f60: 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = -1;.}../*.** T
4f70: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4f80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4f90: 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
4fa0: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4fb0: 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  y.** when this f
4fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4fd0: 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74  d (i.e. have eSt
4fe0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
4ff0: 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  D). This.** func
5000: 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63  tion saves the c
5010: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65  urrent cursor ke
5020: 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70  y in variables p
5030: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a  Cur->nKey and.**
5040: 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c   pCur->pKey. SQL
5050: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5060: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
5070: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
5080: 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  ror .** code oth
5090: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
50a0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
50b0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79  pen on an intkey
50c0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
50d0: 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20   integer key.** 
50e0: 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73  (the rowid) is s
50f0: 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e  tored in pCur->n
5100: 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b  Key and pCur->pK
5110: 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74  ey is left set t
5120: 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68  o.** NULL. If th
5130: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
5140: 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   on a non-intkey
5150: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75   table, then pCu
5160: 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73  r->pKey is .** s
5170: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
5180: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
5190: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
51a0: 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
51b0: 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79  ning .** the key
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74  saveCursorKey(Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
51f0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5200: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5210: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5220: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
5240: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5250: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5260: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5270: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5280: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5290: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
52a0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
52b0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
52c0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
52d0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
52e0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
52f0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5300: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5310: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5320: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5330: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5340: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5350: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5360: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5370: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5380: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5390: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
53a0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
53b0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
53c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
53d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
53e0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
53f0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5400: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5410: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
5420: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
5430: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
5440: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
5450: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5460: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
5470: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
5480: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
5490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
54b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
54e0: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
54f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5510: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
5520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5530: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5540: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5560: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5570: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
5590: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
55a0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
55b0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
55c0: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
55d0: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
55e0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
55f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
5600: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
5610: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
5620: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
5630: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5640: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
5650: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
5660: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
5670: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
5680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5690: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
56a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
56b0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
56c0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
56d0: 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
56e0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
56f0: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5700: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5710: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5720: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
5730: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5740: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
5750: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
5760: 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
5770: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
5780: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
5790: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
57a0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43  saveCursorKey(pC
57b0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
57c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57d0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
57e0: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
57f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5810: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5820: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
5830: 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
5840: 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
5850: 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a  l|BTCF_AtLast);.
5860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5890: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
58a0: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
58b0: 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50  List(BtCursor*,P
58c0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
58d0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
58e0: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
58f0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
5900: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
5910: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
5920: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5930: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22  t-page iRoot.  "
5940: 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f  Saving the curso
5950: 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e  r position" mean
5960: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f  s that.** the lo
5970: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74  cation in the bt
5980: 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65  ree is remembere
5990: 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  d in such a way 
59a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a  that it can be.*
59b0: 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20  * moved back to 
59c0: 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66  the same spot af
59d0: 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61  ter the btree ha
59e0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
59f0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
5a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  e is called just
5a10: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70   before cursor p
5a20: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
5a30: 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20  o modify the.** 
5a40: 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70  table, for examp
5a50: 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74  le in BtreeDelet
5a60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
5a70: 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rt()..**.** If t
5a80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
5a90: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
5aa0: 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
5ab0: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a  then all such .*
5ac0: 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64  * cursors should
5ad0: 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46   have their BTCF
5ae0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5af0: 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75  et.  The btreeCu
5b00: 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  rsor().** routin
5b10: 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20  e enforces that 
5b20: 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  rule.  This rout
5b30: 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74  ine only needs t
5b40: 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a  o be called in.*
5b50: 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63  * the uncommon c
5b60: 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74  ase when pExpect
5b70: 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75   has the BTCF_Mu
5b80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63  .**.** If pExpec
5ba0: 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e  t!=NULL and if n
5bb0: 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  o other cursors 
5bc0: 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65  are found on the
5bd0: 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c   same root-page,
5be0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43  .** then the BTC
5bf0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5c00: 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c  on pExpect is cl
5c10: 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20  eared, to avoid 
5c20: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74  another.** point
5c30: 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  less call to thi
5c40: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
5c50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5c60: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5c70: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5c80: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5c90: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5ca0: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
5cb0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
5cc0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5cd0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
5ce0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
5cf0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
5d00: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5d10: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5d20: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5d30: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5d40: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5d50: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5d70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5d90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5da0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
5db0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5dc0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5dd0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5de0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5df0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5e00: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5e10: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5e20: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5e30: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74   }.  if( p ) ret
5e40: 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f  urn saveCursorsO
5e50: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
5e60: 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20  pExcept);.  if( 
5e70: 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70  pExcept ) pExcep
5e80: 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  t->curFlags &= ~
5e90: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
5ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5eb0: 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65  K;.}../* This he
5ec0: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
5ed0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64  saveAllCursors d
5ee0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
5ef0: 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a  ork of saving.**
5f00: 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20   the cursors if 
5f10: 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f  and when a curso
5f20: 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  r is found that 
5f30: 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
5f40: 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65  s saving..** The
5f50: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20   common case is 
5f60: 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20  that no cursors 
5f70: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f80: 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
5f90: 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f  e is.** broken o
5fa0: 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c  ut from its call
5fb0: 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  er to avoid unne
5fc0: 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f  cessary stack po
5fd0: 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a  inter movement..
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5ff0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
6000: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
6010: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20  .  BtCursor *p, 
6020: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6030: 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74  irst cursor that
6040: 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f   needs saving */
6050: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6070: 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68  save cursor with
6080: 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76   this iRoot. Sav
6090: 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f  e all if zero */
60a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
60b0: 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  cept    /* Do no
60c0: 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73  t save this curs
60d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20  or */.){.  do{. 
60e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
60f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
6100: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
6110: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Root) ){.      i
6120: 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
6130: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
6140: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6150: 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
6160: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
6170: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6180: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
6190: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
61a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
61b0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
61e0: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
61f0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6200: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6210: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6220: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6230: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6250: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6260: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6270: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6280: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6290: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
62a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
62b0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
62c0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
62d0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
62e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
62f0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6300: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6320: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6330: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6340: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6350: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6360: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6370: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6380: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6390: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
63a0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
63b0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
63c0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
63d0: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
63e0: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
63f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6400: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6410: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6420: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6430: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6440: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6450: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6460: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6470: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6480: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6490: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
64a0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
64b0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
64c0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
64d0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
64e0: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
64f0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6500: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6510: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6530: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6540: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6550: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6560: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6570: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6580: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6590: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
65a0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
65b0: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
65c0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
65d0: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
65e0: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
65f0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
6600: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
6610: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6620: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6630: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6640: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
6660: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
6670: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
6680: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
6690: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
66a0: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
66b0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
66c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
66d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
66e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
66f0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
6700: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
6710: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
6720: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
6730: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
6740: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6750: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6760: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
6770: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
6780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6790: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
67b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
67c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
67d0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
67e0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
67f0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
6800: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6820: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6830: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6860: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6870: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6880: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6890: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
68a0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
68b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
68c0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
68d0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
68e0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
68f0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
6900: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
6910: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
6920: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
6930: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
6940: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
6950: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6960: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
6970: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
6980: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
6990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
69a0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
69d0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
69e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
69f0: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
6a00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6a10: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
6a20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6a30: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6a40: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6a50: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6a60: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6a70: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6a80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a90: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6aa0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6ab0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6ac0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
6ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6b70: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6b90: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6ba0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6bc0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
6bd0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
6be0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6c10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6c20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6c40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6c50: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6c60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6c70: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6c80: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6c90: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6ca0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6cb0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6cc0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
6cd0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
6ce0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6cf0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6d00: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6d10: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6d20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6d30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6d40: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6d50: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6d60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6d70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6d80: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6d90: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6da0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6dc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
6dd0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
6de0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6df0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6e00: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6e20: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6e30: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6e40: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6e50: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6e60: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6e70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6e80: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6e90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6ea0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6ec0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6ef0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
6f00: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
6f10: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
6f20: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6f30: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6f40: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6f50: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6f60: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6f70: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6f80: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6f90: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6fa0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6fb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6fc0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
6fd0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
6fe0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
6ff0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7000: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7010: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7020: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7030: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7040: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7050: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7060: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7070: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7080: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7090: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
70c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
70d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
70e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
70f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7100: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7110: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7120: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7130: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7140: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7150: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7160: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7170: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7180: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7190: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
71a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
71b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
71c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
71d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
71e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
71f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7200: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7210: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7220: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7230: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7240: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7250: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7260: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7270: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
72a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
72b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
72c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
72d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
72e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
72f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7300: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7310: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7320: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7330: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7340: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7350: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7360: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7370: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7380: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7390: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
73a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
73c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
73d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
73e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
73f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7400: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7410: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7420: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7430: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7440: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7450: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7460: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7470: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7480: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7490: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
74a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
74b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
74c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
74d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
74e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
74f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7500: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7510: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7520: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7530: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7540: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7550: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7560: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7580: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7590: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
75a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
75b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
75c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
75d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
75e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
75f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7600: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7610: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7620: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7630: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7640: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7650: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7660: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7670: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7680: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7690: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
76a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
76b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
76c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
76d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
76e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
76f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7700: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7710: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7720: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7730: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7740: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7750: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7760: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7770: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7780: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7790: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
77a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
77b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
77c0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
77e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
77f0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7800: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7810: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7820: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7830: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7840: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7850: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7860: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7870: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7880: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7890: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
78a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
78b0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
78c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
78d0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
78e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
78f0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7900: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7910: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7930: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7940: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7950: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7970: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7980: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7990: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
79a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
79b0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
79c0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
79d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
79e0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
79f0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7a10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7a20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7a50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7a60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7a70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7a90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7aa0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ab0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7ac0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7ad0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7ae0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7af0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7b00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7b10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7b20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7b30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7b40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7b50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7b60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7b70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7b90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ba0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7bb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7bc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7bd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7be0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7c10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7c30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7c40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7c50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7c60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7c90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7ca0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7cb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7cc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7cd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7ce0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7cf0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
7d00: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7d10: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7d20: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7d30: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7d40: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7d50: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7d60: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7d70: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7d80: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
7dd0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
7de0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
7df0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7e00: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7e10: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7e20: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7e30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7e50: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7e60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7e80: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7e90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7ea0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7eb0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
7ec0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
7ed0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
7ee0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
7ef0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
7f00: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7f20: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7f30: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7f40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7f60: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7f70: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7f80: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7f90: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7fa0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7fb0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
7fd0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7fe0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
7ff0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8000: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8010: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8020: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8030: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8040: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8050: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8060: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8080: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8090: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
80a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
80b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
80c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
80d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
80e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
80f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8100: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8120: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8130: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8140: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8150: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8160: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8170: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8180: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8190: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
81a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
81b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
81d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
81e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
81f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8200: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8210: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8220: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8230: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8240: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8250: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8260: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8270: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8280: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8290: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
82a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
82b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
82c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
82d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
82e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
82f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8300: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8310: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8320: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8330: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8340: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8360: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8370: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
8380: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
8390: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
83a0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
83b0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
83c0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
83d0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
83e0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
83f0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8400: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8420: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8430: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8440: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8450: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8460: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8470: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
8480: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
8490: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
84a0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
84c0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
84d0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
84e0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
84f0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8500: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8510: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8520: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8530: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8540: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8550: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8560: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8570: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8580: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
8590: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
85a0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
85b0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85c0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
85d0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
85e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
85f0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8600: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8610: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8620: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8630: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8640: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8650: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8660: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8670: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
8680: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
8690: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
86a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
86b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
86c0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
86d0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
86e0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8720: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8730: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8750: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8760: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8770: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8780: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8790: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
87a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
87b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
87c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
87d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
87e0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
87f0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8800: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8820: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8830: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8840: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8850: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8860: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8870: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
8880: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
8890: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
88a0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
88b0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
88c0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
88d0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
88e0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
88f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8910: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8920: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8930: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8940: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8970: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8980: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8990: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
89a0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
89b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
89c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
89d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
89e0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
89f0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8a00: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8a10: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8a20: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8a30: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8a40: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8a50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8a60: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8a70: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8a80: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8a90: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8aa0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8ab0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8ac0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8ad0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8ae0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8af0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8b00: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8b10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8b20: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8b40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8b50: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8b70: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8b80: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8b90: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8ba0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8bc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8bd0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8be0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8bf0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8c00: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8c10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8c20: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8c30: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8c40: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8c50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8c60: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8c70: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8c80: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8c90: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8ca0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8cb0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8cc0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8cd0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8ce0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8cf0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8d00: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8d10: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8d30: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8d40: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8d50: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8d60: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8d70: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8d80: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8d90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8db0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8dc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8e00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8e10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8e30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8e40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8e50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8e60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8e90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8eb0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
8ed0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
8ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
8ef0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
8f00: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
8f10: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
8f20: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
8f30: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
8f40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8f50: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
8f70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
8f80: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8f90: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
8fa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8fb0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fc0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8fd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8fe0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8ff0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9000: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9010: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9020: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9030: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9040: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9050: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9060: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9070: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9090: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
90a0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
90b0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
90e0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
90f0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9100: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9110: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9170: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9190: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
91a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
91b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
91c0: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
91d0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
91e0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
91f0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9200: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9210: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9220: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9230: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9240: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9250: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9260: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9270: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9280: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9290: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
92a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
92b0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
92c0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
92d0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
92e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
92f0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9300: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9310: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9320: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9330: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9340: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9350: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9360: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9370: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9380: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9390: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
93a0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
93b0: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
93c0: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
93d0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
93e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
93f0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9400: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9410: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9420: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9430: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9440: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9450: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9460: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9470: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9480: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9490: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
94a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
94b0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
94c0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
94d0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9500: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9510: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9520: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9530: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9540: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9550: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9580: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9590: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
95b0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
95c0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
95d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
95e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
95f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9660: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9670: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9680: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9690: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
96a0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
96b0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
96d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
96e0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
96f0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9700: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9710: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9720: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9730: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9740: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9750: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9760: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9770: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9780: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97b0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
97c0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
97d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
97e0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
97f0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9800: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9810: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9820: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9830: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9840: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9850: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9860: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9890: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98a0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
98c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
98d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
98e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
98f0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9900: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9910: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9920: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9930: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9940: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9950: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9960: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9980: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9990: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9a00: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9a10: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9a20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9a30: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9a40: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9a50: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9a60: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9a70: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9a80: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9a90: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9aa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9ab0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9ac0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9ad0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9ae0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9af0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9b00: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9b10: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9b20: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9b30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9b40: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9b50: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9b60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9b70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9b80: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9b90: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9bb0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9bd0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9be0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9bf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9c00: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9c10: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9c20: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9c30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9c40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9c50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9c60: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9c80: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9c90: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9ca0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9cc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9cd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9ce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9cf0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9d00: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9d10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9d30: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9d40: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9d50: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9d60: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9d70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9d80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9d90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9da0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9db0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9dc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9dd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9de0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9df0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9e00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9e10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9e20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9e30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9e40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9e50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9e60: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9e70: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9e80: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9e90: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ea0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
9eb0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
9ec0: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
9ed0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
9ee0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
9ef0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9f00: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9f10: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
9f20: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9f30: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9f40: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9f50: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9f60: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9f70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
9fa0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
9fb0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
9ff0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a000: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a010: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a020: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a030: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a040: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a050: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a060: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a070: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a080: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a090: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a0a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a0b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a0c0: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a0d0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a0e0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a0f0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a100: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a110: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a120: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a130: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a140: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a150: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a160: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a170: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a180: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a190: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a1a0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a1b0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a1c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a1d0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a1e0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a1f0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a200: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a210: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a220: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a230: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a240: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a260: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a270: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a280: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a290: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a2b0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a2c0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a2d0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a2e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a2f0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a300: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a310: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a320: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a330: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a340: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a350: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a360: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a370: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a380: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a390: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a3a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a3b0: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a3c0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a3e0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a3f0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a400: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a410: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a420: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a430: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a440: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a450: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a460: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a470: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a4c0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a4d0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a500: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a510: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a520: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a530: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a540: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a550: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a560: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a570: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a580: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a5a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a5b0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a5c0: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a5d0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a5e0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a5f0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a600: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a610: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a620: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a630: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a640: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a660: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a670: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a680: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a690: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a6a0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a6b0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a6c0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a6d0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a6e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a6f0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a700: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a710: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a720: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a730: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a740: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a750: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a760: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a770: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a780: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a7a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a7b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a7c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a7d0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a7e0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a7f0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a800: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a810: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a820: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a830: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a840: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a850: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a860: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a870: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a890: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a8a0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
a8b0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
a8c0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
a8d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
a8e0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a8f0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
a900: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
a910: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
a920: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
a930: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
a940: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
a950: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a970: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
a980: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
a990: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
a9a0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
a9b0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
a9c0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
a9d0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
a9e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
a9f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
aa00: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
aa20: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
aa30: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aa40: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aa50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
aa60: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
aa70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
aa80: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
aa90: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
aaa0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
aab0: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
aac0: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
aad0: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
aae0: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
aaf0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ab00: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ab10: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ab20: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ab30: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ab40: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
ab50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
ab60: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
ab70: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
ab80: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
ab90: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
aba0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
abb0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
abc0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
abd0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
abe0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
abf0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
ac00: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
ac10: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
ac20: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
ac30: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
ac40: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ac50: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
ac60: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
ac70: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ac80: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
ac90: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
aca0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
acb0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
acc0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
acd0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ace0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
acf0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ad00: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ad10: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ad20: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ad30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ad40: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
ad50: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
ad60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ad70: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ada0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
add0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
ade0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ae10: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ae20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae40: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
ae50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
ae60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ae70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
ae80: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
ae90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
aea0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
aeb0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aec0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aed0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aee0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
aef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
af10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
af20: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af40: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
af50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
af60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
af70: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
af80: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
af90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
afa0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
afb0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
afc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
afd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
aff0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b000: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b020: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b030: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b040: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b060: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b070: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b090: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b0a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b0c0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b0d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b0e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b0f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b100: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b110: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b120: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b140: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b150: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b160: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b170: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b180: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
b1b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
b1c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
b1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b1e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
b1f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b200: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
b210: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b220: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
b230: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
b240: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b250: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b260: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
b270: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b280: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
b290: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b2a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
b2b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
b2c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
b2d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
b2e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
b2f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b300: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
b310: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b340: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
b350: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
b360: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b370: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
b380: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
b390: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
b3a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
b3b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
b3c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b3d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b3e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b3f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b400: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b410: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
b420: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
b430: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
b440: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
b450: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
b460: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
b470: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
b480: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
b490: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
b4a0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b4b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4e0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
b4f0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
b500: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b510: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
b520: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b530: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
b540: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
b550: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
b560: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
b570: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
b580: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
b590: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
b5a0: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
b5c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
b5d0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
b5e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b5f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b610: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
b620: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
b630: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
b640: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
b650: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
b660: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
b670: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
b680: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b690: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b6a0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
b6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
b6c0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
b6d0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b6e0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
b6f0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
b700: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
b710: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
b720: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
b730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b740: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b760: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
b770: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
b780: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b7a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
b7d0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
b7e0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
b7f0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
b800: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
b810: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
b820: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
b830: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
b840: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
b850: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
b860: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
b870: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
b880: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
b890: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
b8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
b8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b8c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b8d0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
b8e0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
b8f0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
b900: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
b910: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
b920: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
b930: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
b940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
b950: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
b960: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
b970: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
b980: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
b990: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
b9a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
b9b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
b9c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
b9d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
b9e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
b9f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ba00: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ba10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ba20: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ba30: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ba40: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
ba50: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ba60: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
ba70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
ba80: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
ba90: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
baa0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
bab0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
bac0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
bad0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
bae0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
baf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bb00: 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29    assert( pc>0 )
bb10: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
bb20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
bb50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bb60: 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46   R-06866-39125 F
bb70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  reeblocks are al
bb80: 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69  ways connected i
bb90: 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a  n order of.    *
bba0: 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66  * increasing off
bbb0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
bbc0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
bbd0: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
bbe0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
bbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc00: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
bc30: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
bc40: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
bc50: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
bc60: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
bc70: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
bc80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bca0: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
bcb0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
bcc0: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
bcd0: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
bce0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bcf0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
bd00: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
bd10: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
bd40: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
bd50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20  .      if( pc < 
bd60: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
bd70: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
bd80: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
bd90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bda0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
bdb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c      }else if( x<
bde0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
bdf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
be00: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
be20: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
be30: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
be40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
be50: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
be60: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
be80: 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72  ta[hdr+7]>57 ) r
be90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
bea0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
beb0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
bec0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
bed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
bee0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
bef0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
bf00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
bf10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
bf20: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
bf30: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
bf40: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
bf50: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf70: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
bf80: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
bf90: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
bfa0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
bfb0: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
bfc0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
bfd0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
bfe0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
bff0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
c000: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c020: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
c030: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41  x];.    }.    iA
c040: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63  ddr = pc;.    pc
c050: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c060: 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c  ta[pc]);.  }whil
c070: 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75  e( pc );..  retu
c080: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c090: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
c0a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
c0b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
c0c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
c0d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
c0e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
c0f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
c100: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
c110: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
c120: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c130: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
c140: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
c150: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
c160: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
c170: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
c180: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
c190: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
c1a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
c1b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
c1c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
c1d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
c1f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
c200: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
c210: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
c220: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
c230: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
c240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
c250: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
c260: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
c270: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
c280: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
c290: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
c2a0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
c2b0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
c2c0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
c2d0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
c2e0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
c2f0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
c300: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
c310: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c320: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
c330: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c340: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c350: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
c360: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c370: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
c380: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c3a0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
c3b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c3c0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
c3d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c3e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
c3f0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c420: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
c430: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
c440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
c470: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c480: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
c490: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
c4a0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
c4b0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
c4c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
c4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c4e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c4f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c510: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
c560: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
c570: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
c580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c590: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
c5a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c5b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c5d0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
c5e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c5f0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
c600: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
c610: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
c620: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
c630: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
c640: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
c650: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c660: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
c670: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
c680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
c690: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
c6a0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
c6b0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
c6c0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
c6d0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
c6e0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
c6f0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
c700: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
c710: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
c720: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
c730: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
c740: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
c750: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
c760: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
c770: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
c780: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
c790: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
c7a0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
c7b0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
c7c0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
c7d0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
c7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7f0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
c800: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
c810: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c820: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
c830: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
c840: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
c850: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
c860: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
c880: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
c890: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
c8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c8e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c8f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
c900: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
c910: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
c920: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
c930: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
c940: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c950: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
c960: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
c970: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
c980: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
c990: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
c9a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
c9b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
c9c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
c9d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c9e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
c9f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
ca00: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
ca10: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
ca20: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
ca30: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
ca40: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ca50: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ca60: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ca70: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
ca90: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
caa0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
cab0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
cac0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
cad0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
cb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cb10: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
cb20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
cb30: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
cb40: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
cb50: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
cb60: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
cb70: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
cb80: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
cb90: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
cba0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
cbb0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
cbc0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cbe0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
cbf0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
cc00: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
cc10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cc20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc30: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
cc40: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
cc50: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
cc60: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
cc70: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
cc80: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
cc90: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
cca0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ccb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ccc0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ccd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
cce0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ccf0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
cd00: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
cd10: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
cd20: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
cd30: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
cd40: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
cd50: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
cd60: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
cd70: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
cd80: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
cd90: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
cda0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
cdb0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
cdc0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
cdd0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
cde0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
cdf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ce00: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
ce10: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ce20: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ce30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ce40: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ce70: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ce80: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ce90: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
cea0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ceb0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
cec0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ced0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
cee0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
cef0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
cf00: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cf10: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
cf20: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
cf30: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
cf40: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
cf50: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
cf60: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
cf70: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf80: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
cf90: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
cfa0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
cfb0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
cfc0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
cfd0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
cfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cff0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d000: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d010: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d030: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d040: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d050: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d060: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d070: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d080: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d090: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d0b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
d0c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
d0d0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
d0e0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d110: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
d120: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d130: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d160: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
d170: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d180: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
d1b0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
d1c0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
d1d0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
d200: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
d210: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
d220: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
d240: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
d250: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
d260: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
d270: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
d280: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
d290: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
d2a0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
d2b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
d2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d2d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d2e0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
d2f0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
d300: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
d310: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
d320: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
d330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d340: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d360: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d370: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d390: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
d3a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
d3b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
d3c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
d3d0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
d3e0: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
d3f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d400: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
d410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d420: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d440: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
d450: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
d460: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
d470: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
d480: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
d490: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
d4a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
d4b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
d4c0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
d4d0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
d4e0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
d4f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
d500: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
d510: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
d520: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
d530: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
d540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
d550: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
d560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
d570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
d580: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
d590: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
d5a0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
d5b0: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
d5c0: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
d5d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d5e0: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
d5f0: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
d600: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
d610: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
d620: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
d630: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
d640: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
d650: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
d660: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
d670: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
d680: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d690: 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26  ata[iPtr]))>0 &&
d6a0: 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74   iFreeBlk<iStart
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
d6c0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20  reeBlk<iPtr+4 ) 
d6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d6f0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
d700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d710: 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20   iFreeBlk>iLast 
d720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d730: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d740: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
d750: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
d760: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
d770: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d780: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
d790: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
d7a0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
d7b0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
d7c0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
d7d0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
d7e0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
d7f0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
d800: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
d810: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d820: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
d830: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
d840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
d850: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
d860: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
d870: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
d880: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
d890: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
d8a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
d8b0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d8e0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
d8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d900: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
d910: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
d920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d930: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
d940: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d950: 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  PT;.      iSize 
d960: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
d970: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
d980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d990: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
d9a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d9b0: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
d9c0: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
d9d0: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
d9e0: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
d9f0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
da00: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
da10: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
da20: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
da30: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
da40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
da50: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
da70: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
da80: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
da90: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
daa0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
dab0: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
dac0: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
dad0: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
dae0: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db00: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
db10: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
db20: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
db30: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
db40: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
db50: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db70: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
db80: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
db90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dba0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
dbb0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
dbc0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
dbd0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
dbe0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
dbf0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
dc00: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
dc10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
dc20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dc30: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
dc40: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
dc70: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
dc80: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
dc90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
dca0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
dcb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dcc0: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
dce0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd00: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
dd10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
dd20: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
dd30: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
dd40: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
dd50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
dd60: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
dd70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd80: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
dd90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
dda0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
ddb0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
ddc0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
ddd0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
de00: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
de10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
de20: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
de30: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
de40: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
de50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
de60: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
de70: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
de80: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
de90: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
dea0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
deb0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
dec0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ded0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
dee0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
def0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
df00: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
df10: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
df20: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
df30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
df40: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
df50: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
df60: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
df70: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
df80: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
df90: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
dfa0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
dfb0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
dfc0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
dfd0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
dfe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
e000: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
e010: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
e020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e030: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e040: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e050: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
e060: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
e070: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
e080: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
e090: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
e0a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
e0b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e0c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
e0d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
e0e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e0f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
e100: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
e110: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
e120: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e130: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
e140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e150: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
e160: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
e170: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e180: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
e190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
e1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e1e0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
e1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
e200: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e210: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
e220: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e230: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e240: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e250: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e260: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
e270: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
e280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
e290: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
e2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e2b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e2c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e2d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e2e0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e300: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
e310: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e320: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e330: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e340: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e350: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e360: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e380: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e390: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e3a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e3b0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e3c0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e3d0: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e3f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e400: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e410: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e420: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e430: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e440: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e450: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e460: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e470: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e480: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e490: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e4a0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e4b0: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e4c0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e4d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e4e0: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e4f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e500: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e510: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e520: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e530: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e540: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e550: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e570: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e590: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e5a0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e5c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e5d0: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e5e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e5f0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e600: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e610: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e640: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e650: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e660: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e690: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e6a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e6b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e6c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e6d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e6e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e6f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e700: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e710: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e720: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e730: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e740: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e750: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e760: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e770: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e780: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e790: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e7a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e7b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e7c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e7d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e7f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e800: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e810: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e830: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e860: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e870: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e880: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e890: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e8a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e8b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e8c0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e8d0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e900: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e910: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e920: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e930: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e940: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e950: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e960: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e970: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e980: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e990: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e9a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e9c0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e9d0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e9e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e9f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
ea00: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
ea10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ea20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
ea30: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
ea40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
ea50: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
ea60: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
ea70: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
ea80: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
ea90: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
eaa0: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
eab0: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
eac0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
ead0: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eaf0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
eb00: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
eb10: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
eb30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
eb40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eb50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
eb60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
eb70: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
eb80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
eb90: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
eba0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ebb0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ebc0: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ebd0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ebe0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ebf0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ec00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ec10: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
ec20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
ec50: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
ec60: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
ec70: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
ec80: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ec90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ecb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
ecc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ecd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
ece0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
ecf0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
ed00: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ed20: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ed40: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ed50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ed60: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ed70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ed80: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ed90: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
eda0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
edb0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
edc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
edd0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ede0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
edf0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ee00: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
ee10: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ee20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ee30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ee40: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ee50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ee60: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ee70: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ee80: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ee90: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
eea0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
eec0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
eed0: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
eee0: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
eef0: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ef00: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
ef10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ef20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ef50: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef60: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ef70: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ef80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ef90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
efa0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
efb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
efc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
efd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
efe0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
eff0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f000: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f010: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f020: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f030: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
f070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
f080: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
f090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f0a0: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
f0b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
f0c0: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
f0d0: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
f0e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
f0f0: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
f100: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f110: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
f120: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
f130: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
f140: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
f150: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
f160: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f170: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f180: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f190: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f1a0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f1b0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f1c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f1d0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f1e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f1f0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f200: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f210: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f220: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f230: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f240: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f250: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f260: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f280: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f290: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f2a0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f2b0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f2c0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f2d0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f2e0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f300: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f310: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f320: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f330: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f340: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f350: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f360: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f370: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f390: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f3a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f3b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f3d0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f3e0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f3f0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f400: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f410: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f420: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f430: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f440: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f450: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f460: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f470: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f480: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f4a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f4b0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f4c0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f4f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f500: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f510: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f520: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f540: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f550: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f560: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f570: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f580: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f5c0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f5d0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f5e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f5f0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f600: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f610: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f620: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f630: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f640: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f650: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f660: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f690: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f6a0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f6b0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f6c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f6e0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f6f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f700: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f710: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f720: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f730: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f740: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f750: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f760: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f770: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f790: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f7a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f7b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f7c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f7d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f7e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f7f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f800: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f810: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f820: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f830: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f840: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f850: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f860: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f880: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f890: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f8b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f8c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f8d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f8e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f8f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f900: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f910: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f920: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f930: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f940: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f950: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f960: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f970: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f980: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f990: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f9d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f9e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f9f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
fa00: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
fa10: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
fa20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
fa30: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fa40: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
fa50: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
fa60: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
fa70: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
fa80: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
fa90: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
faa0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
fab0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
fac0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
fae0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
faf0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
fb00: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
fb10: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
fb20: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
fb30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
fb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
fb60: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fb70: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fb80: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fb90: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fbb0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fbc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fbe0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fbf0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fc00: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
fc10: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fc20: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fc30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fc50: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
fc60: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fc70: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fc80: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fc90: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fcb0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fcc0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fcd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fce0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fcf0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fd00: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fd10: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fd20: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fd30: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fd50: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fd60: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fd70: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd90: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fda0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fdb0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fde0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fdf0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fe00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fe10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fe20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fe40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fe50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe60: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fe70: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fe80: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fe90: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fea0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
feb0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fec0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fed0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fee0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fef0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ff00: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
ff10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
ff20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
ff30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
ff40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ff50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ff60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ff70: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ff80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ff90: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ffa0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ffb0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ffc0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ffd0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ffe0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fff0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10000 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10010 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10030 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10040 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10050 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10060 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10070 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10080 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10090 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
100a0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
100b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
100c0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
100d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
100f0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10100 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10110 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10120 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10130 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10140 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10150 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10160 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10170 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10180 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10190 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
101a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
101b0 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
101c0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
101d0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
101e0 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
101f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10200 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10220 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10230 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10240 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10250 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10260 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10270 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10290 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
102a0 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
102b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
102c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
102d0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
102e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
102f0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10300 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10310 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
10350 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
10360 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
10370 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
10380 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
103a0 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
103b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
103c0 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
103d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
103e0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
103f0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
10400 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
10410 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
10420 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
10430 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
10440 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
10450 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
10460 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
10470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
10480 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
10490 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
104a0 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
104b0 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
104c0 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
104d0 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
104e0 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
104f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
10500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
10520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
10540 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
10550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
10560 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10570 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
10580 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10590 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
105a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
105b0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
105c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
105d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
105e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
105f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10600 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
10610 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10620 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
10630 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
10640 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
10650 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
10660 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
10670 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
10680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10690 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
106b0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
106c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
106d0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
106e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
106f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10700 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10710 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10720 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10730 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10750 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10760 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10770 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10780 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10790 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
107a0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
107b0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
107c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
107d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
107e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
107f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10810 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10820 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10830 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10840 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10850 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10870 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10880 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10890 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
108b0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
108c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
108d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
108e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
108f0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10900 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10910 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10930 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10940 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10950 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10960 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10970 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10980 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10990 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
109a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
109b0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
109c0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
109d0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
109e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
109f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10a00 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10a10 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10a20 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10a30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10a40 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10a50 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10a60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10a70 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10a90 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10aa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
10ab0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
10ad0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
10ae0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
10af0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
10b00 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10b10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10b20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10b30 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10b40 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10b50 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10b70 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10b80 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10b90 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10ba0 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
10bb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
10bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10bd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
10be0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
10bf0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
10c00 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10c10 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10c20 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10c40 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10c50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10c60 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10cc0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
10cd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
10ce0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
10cf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
10d00 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10d10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10d20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10d40 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10d50 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10d60 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10d90 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10db0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10e00 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10e20 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10e30 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10e40 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10e50 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10e70 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10e80 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10e90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
10eb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ec0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
10ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10ee0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10f10 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10f20 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10f30 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10f40 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10f50 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10f60 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
10f70 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10f80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
10fa0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
10fb0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
10fc0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10fd0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
10ff0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
11000 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11030 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
11040 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11050 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
11070 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
11080 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
11090 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
110a0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
110b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
110c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
110d0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
110e0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
110f0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
11100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
11110 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
11120 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
11130 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
11140 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
11150 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
11160 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
11170 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
11180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11190 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
111a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111d0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111f0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11200 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11210 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11220 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11230 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11240 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11250 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11260 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11280 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11290 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
112a0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
112b0 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
112c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
112f0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11300 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11310 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11330 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11340 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11350 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11370 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11380 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11390 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
113a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113c0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
113d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11420 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11430 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11440 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11450 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11460 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11470 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11480 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11490 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
114a0 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
114b0 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
114c0 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
114d0 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
114e0 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
114f0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11500 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
11510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
11520 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
11530 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
11540 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11550 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11560 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11570 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11580 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11590 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
115a0 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
115b0 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
115c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
115d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
115e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
115f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11600 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
11610 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
11620 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
11630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11640 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11650 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11660 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11670 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11680 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11690 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
116b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
116c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
116d0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
116f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11700 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
11710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
11720 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
11730 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11740 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11750 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11780 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11790 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
117a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
117b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
117d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
117e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
117f0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
11800 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
11810 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
11820 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
11830 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
11840 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11850 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11870 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11880 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11890 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
118b0 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
118c0 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
118d0 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
118e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
118f0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
11900 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11920 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
11930 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
11940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11950 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11970 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
119a0 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
119b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
119c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
119d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
11a00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11a20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11a30 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
11a40 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11a50 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11a60 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11a70 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11a90 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11aa0 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11ab0 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11ac0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11ad0 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11ae0 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
11af0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
11b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
11b10 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
11b20 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
11b30 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
11b40 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11b60 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11b70 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11b80 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11b90 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11ba0 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11bb0 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11bc0 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11be0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
11bf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
11c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
11c10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11c20 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
11c40 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11c50 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c70 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11c80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11c90 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11cb0 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11cc0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11cd0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11ce0 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11cf0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11d20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11d30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11d60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11d70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11d80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11d90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11da0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11db0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11dc0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11dd0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11de0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11df0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11e00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11e10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11e20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11e30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11e40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11e50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11e70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11e80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11e90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11ea0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11eb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11ec0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11ed0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ef0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11f00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11f10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11f20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11f30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11f40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11f60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11f70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11f80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11f90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11fa0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11fb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11fc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11fd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11ff0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12000 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12010 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12020 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12030 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12050 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12060 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12070 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12090 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
120a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120b0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
120c0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12110 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12130 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12140 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12150 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12160 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12170 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12180 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12190 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
121a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
121b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
121c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
121d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
121f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12200 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12210 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12240 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12250 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12260 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12290 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
122a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
122b0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
122c0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
122d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
122e0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
122f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12300 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12330 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12360 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12370 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12380 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12390 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
123a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
123b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
123c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
123d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
123e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12400 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12410 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12420 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12430 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12440 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12450 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12460 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12470 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12480 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12490 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
124a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
124c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
124d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
124e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
124f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
12500 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
12510 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
12540 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12550 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12580 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12590 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
125a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
125b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
125f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12600 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
12610 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
12620 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
12630 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
12640 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12650 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12660 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12670 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12680 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12690 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
126a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
126b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
126c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
126d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
126e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
126f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
12700 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12710 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12720 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
12730 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
12740 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12750 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12760 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12790 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
127a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
127b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
127c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
127d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
127f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
12800 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
12810 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
12820 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
12850 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12860 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12870 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12880 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12890 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
128a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
128b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
128c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
128d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
128f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12920 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12930 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12940 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12950 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12960 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12970 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12980 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12990 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
129a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
129b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
129c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
129d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
129e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
129f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12a00 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12a10 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12a20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12a30 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12a40 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12a50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12a60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12a70 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12a80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a90 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12aa0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12ab0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ac0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12ad0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12ae0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12af0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12b00 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12b10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12b30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b60 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12b80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12b90 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12ba0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12bc0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12bd0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12be0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12c10 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12c20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12c30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c50 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12c70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12cb0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12cc0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12cd0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ce0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12cf0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12d00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12d20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12d30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12d40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12d50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12d80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12d90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12da0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12db0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12dc0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12dd0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12df0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12e00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12e10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12e30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12e40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12e50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12e60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12e70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12ea0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12eb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12ed0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12ee0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12f00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12f10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12f20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12f30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12f50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12f60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12f80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12fe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12ff0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13020 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13030 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13080 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
130a0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
130b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
130c0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
130d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
130e0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
130f0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13100 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13110 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13120 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13130 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13140 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13150 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13160 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13170 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13180 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
131a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
131b0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
131c0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
131d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
131e0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
131f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13200 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13210 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13220 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13230 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13240 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13250 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13260 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13270 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13280 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13290 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
132a0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
132b0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
132c0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
132d0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
132e0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
13300 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13340 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13380 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13390 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
133a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
133b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
133d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
133e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
133f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13410 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13420 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
13460 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
13470 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
134b0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
134c0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
134d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
134e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
134f0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13500 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13510 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
13520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
13550 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13560 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
13570 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13580 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13590 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
135a0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
135b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
135c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
135d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
135e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
135f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13600 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13630 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
13640 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
13650 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13660 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13680 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13690 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
136c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
136d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
136e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
136f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13700 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13710 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
13720 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
13730 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
13740 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
13750 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
13760 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
13770 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13790 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
137a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
137b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
137c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
137d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
137e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
137f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13800 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13810 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
13820 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
13830 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13840 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13860 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
13870 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13880 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13890 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
138a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
138b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
138c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
138d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
138e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
138f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13900 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13910 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
13920 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
13930 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
13940 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
13950 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
13960 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
13970 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13980 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13990 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
139a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
139b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
139c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
139d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
139e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
139f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13a10 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
13a20 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a30 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
13a40 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
13a50 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
13a60 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13a70 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13a90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13ab0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13ac0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13ad0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13ae0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13af0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13b00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13b10 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
13b20 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
13b30 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
13b40 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
13b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
13b70 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13b80 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13b90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ba0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13bb0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bf0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13c00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13c10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
13c20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13c30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13c40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
13c50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
13c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13ca0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13cb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13cc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13cd0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13ce0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13cf0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13d00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13d10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13d20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13d30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13d40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
13d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13d90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13da0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13dc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13dd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13df0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13e00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13e10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13e20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13e30 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13e40 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13e50 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13e60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13e70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13e80 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13e90 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13ea0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13ee0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13ef0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13f10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13f20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13f50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
13f60 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13f90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13fa0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
13fb0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
13fc0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13fd0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13fe0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
13ff0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14000 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14010 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14030 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14050 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14070 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14090 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
140a0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
140b0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
140c0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
140d0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
140e0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
140f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14100 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14110 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14120 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14130 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14140 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14150 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14160 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14170 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14180 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14190 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
141a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
141b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
141c0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
141d0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
141e0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14200 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14210 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14220 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70  .        if( (up
14230 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29  tr)p->pBt<(uptr)
14240 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
14250 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14260 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
14270 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
14280 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
14290 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
142a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
142b0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
142c0 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29  >pNext && (uptr)
142d0 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74  pSib->pNext->pBt
142e0 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b  <(uptr)p->pBt ){
142f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
14300 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
14310 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14320 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14330 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14340 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14350 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
14360 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
14370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14380 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
14390 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
143a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
143b0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
143c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
143d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
143e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
143f0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
14400 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
14410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14420 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
14430 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14450 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
14460 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
14470 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14480 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14490 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
144a0 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
144b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
144c0 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
144d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
144e0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
144f0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
14500 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
14510 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
14520 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
14530 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
14540 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
14550 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
14560 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
14570 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
14580 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14590 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
145a0 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
145b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
145c0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
145d0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
145e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
145f0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
14600 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
14610 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
14620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14630 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
14640 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
14650 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14660 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
14670 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14680 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
14690 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
146a0 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
146b0 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
146c0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
146d0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
146e0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
146f0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
14700 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
14710 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
14720 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
14730 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
14740 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
14750 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
14760 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
14770 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14780 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
147a0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
147b0 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
147c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
147d0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
147e0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
147f0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
14800 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14810 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
14820 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14830 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
14840 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
14850 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14860 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14870 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
14880 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14890 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
148a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
148b0 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
148c0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
148d0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
148e0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
148f0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
14900 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14910 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14920 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
14930 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
14940 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
14950 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14960 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14970 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
14980 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
14990 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
149a0 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
149b0 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
149c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
149d0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
149e0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
149f0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
14a00 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14a10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14a20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14a30 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
14a40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
14a50 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
14a60 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
14a70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14a80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14a90 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
14aa0 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
14ab0 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
14ac0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
14ad0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
14ae0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
14af0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
14b00 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
14b10 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
14b20 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
14b30 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
14b40 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
14b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
14b60 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
14b70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14b80 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
14b90 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
14ba0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
14bb0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
14bc0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
14bd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
14be0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
14bf0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
14c00 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
14c10 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
14c20 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
14c30 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
14c40 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
14c50 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
14c60 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
14c70 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
14c80 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
14c90 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
14ca0 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
14cb0 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
14cc0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
14cd0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
14ce0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14cf0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14d00 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14d10 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14d20 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14d30 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14d40 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14d50 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14d60 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14d70 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14d80 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
14d90 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
14da0 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
14db0 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
14dc0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
14dd0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
14de0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14df0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14e00 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14e10 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14e20 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14e30 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14e40 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14e50 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14e60 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14e70 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14e80 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
14e90 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
14ea0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
14eb0 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
14ec0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
14ed0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
14ee0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14ef0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14f00 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14f10 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14f20 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14f30 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
14f40 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
14f50 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
14f60 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
14f70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
14f80 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14f90 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
14fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
14fb0 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
14fc0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
14fd0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
14fe0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14ff0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
15000 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
15010 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15020 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
15030 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15040 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15050 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15060 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15070 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15080 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15090 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
150a0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
150b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
150c0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
150d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
150e0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
150f0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
15100 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
15110 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
15120 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
15130 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15140 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15150 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15160 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15170 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15180 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15190 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
151a0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
151b0 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
151c0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
151d0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
151e0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
151f0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
15200 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
15210 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
15220 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
15230 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15240 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15250 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15260 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15270 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15280 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15290 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
152a0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
152b0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
152c0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
152d0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
152e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
152f0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
15300 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
15310 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
15320 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15330 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15340 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
15350 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
15360 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
15370 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15380 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
15390 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
153a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
153b0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
153c0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
153d0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
153e0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
153f0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15400 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
15410 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
15420 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
15430 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
15440 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
15450 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
15460 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
15470 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
15480 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
15490 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
154a0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
154b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
154c0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
154d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
154e0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
154f0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
15500 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
15510 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
15520 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
15530 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
15540 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
15550 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15560 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
15570 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
15580 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
15590 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
155a0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
155b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
155c0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
155d0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
155e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
155f0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
15600 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
15610 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
15620 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
15630 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
15640 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15650 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
15660 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
15670 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15680 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15690 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
156a0 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
156b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
156c0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
156d0 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
156e0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
156f0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
15700 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
15710 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
15720 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
15730 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
15740 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
15750 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
15760 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
15770 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
15780 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
15790 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
157a0 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
157b0 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
157c0 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
157d0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
157e0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
157f0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
15800 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15810 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
15820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15830 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15840 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15850 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15860 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15870 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
15880 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15890 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
158a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
158b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
158c0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
158d0 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
158e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
158f0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
15900 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
15910 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
15920 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
15930 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
15940 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
15950 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
15960 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
15970 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
15980 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
15990 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
159a0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
159b0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
159c0 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
159d0 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
159e0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
159f0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
15a00 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
15a10 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
15a20 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
15a30 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
15a40 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
15a50 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
15a60 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15a70 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
15a80 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
15a90 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
15aa0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
15ab0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15ac0 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
15ad0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ae0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15af0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15b00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15b10 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
15b20 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
15b30 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
15b40 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15b50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15b60 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
15b70 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
15b80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15b90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ba0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15bb0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15bc0 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15bd0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15be0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15bf0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15c00 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15c10 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15c20 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15c30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15c40 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15c60 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15c70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15c80 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15c90 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15ca0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15cb0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15cc0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15ce0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15cf0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15d00 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15d10 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15d20 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15d30 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15d40 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15d50 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15d60 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15d70 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15d80 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15d90 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15da0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15db0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15dc0 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15dd0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15de0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15df0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15e00 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15e10 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15e20 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15e30 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15e40 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15e50 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15e60 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15e70 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15e80 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15e90 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15ea0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15eb0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15ec0 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15ed0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ee0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15ef0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15f00 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15f10 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15f20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15f30 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15f40 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15f50 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15f60 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15f70 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15f80 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15f90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15fa0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15fb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15fc0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15fd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15fe0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15ff0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
16000 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
16010 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
16020 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16040 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16050 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
16060 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
16070 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
16080 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16090 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
160a0 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
160b0 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
160c0 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
160d0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
160e0 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
160f0 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
16100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
16110 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
16120 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
16130 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
16140 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
16150 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
16160 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
16170 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
16180 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
16190 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
161a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
161b0 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
161c0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
161d0 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
161e0 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
161f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16200 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
16210 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
16220 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
16230 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
16240 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
16250 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
16260 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
16270 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
16280 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
16290 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
162a0 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
162b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
162c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
162d0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
162e0 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
162f0 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
16300 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
16310 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
16320 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
16330 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
16340 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
16350 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
16360 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
16370 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
16380 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
16390 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
163a0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
163b0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
163c0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
163d0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
163e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
163f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16400 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16410 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
16420 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
16430 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16440 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
16450 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16460 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
16470 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16480 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
16490 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
164a0 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
164b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
164c0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
164d0 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
164e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
164f0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
16500 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
16510 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
16520 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
16530 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
16540 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
16550 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
16560 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16570 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
16580 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
16590 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
165a0 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
165b0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
165c0 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
165d0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
165e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
165f0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
16600 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
16610 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
16620 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
16630 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
16640 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
16650 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16660 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
16670 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
16680 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16690 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
166a0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
166b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
166c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
166d0 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
166e0 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
166f0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16700 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
16710 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16720 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16740 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
16750 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
16760 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
16770 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16780 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
16790 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
167a0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
167b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
167c0 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
167d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
167e0 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
167f0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
16800 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
16810 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
16820 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
16830 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
16840 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
16850 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
16860 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
16870 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
16880 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
16890 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
168a0 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
168b0 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
168c0 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
168d0 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
168e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
168f0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
16900 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
16910 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
16920 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
16930 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
16940 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
16950 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
16960 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
16970 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
16980 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
16990 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
169a0 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
169b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
169c0 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
169d0 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
169e0 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
169f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16a00 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
16a10 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
16a20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
16a30 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
16a40 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
16a50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16a60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16a70 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
16a80 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
16a90 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
16aa0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
16ab0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
16ac0 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
16ad0 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
16ae0 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
16af0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
16b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
16b10 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
16b20 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
16b30 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
16b40 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
16b50 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
16b60 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
16b70 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
16b80 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
16b90 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
16ba0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16bb0 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
16bc0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16bd0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16be0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16bf0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
16c00 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16c10 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
16c20 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
16c30 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
16c40 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
16c50 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
16c60 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
16c70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16c80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16c90 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
16ca0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
16cb0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
16cc0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
16cd0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
16ce0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
16cf0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
16d00 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
16d10 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
16d20 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
16d30 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
16d40 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16d50 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
16d60 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
16d70 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
16d80 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16d90 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16da0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16db0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
16dc0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
16dd0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
16de0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16df0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16e00 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
16e10 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
16e20 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
16e30 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
16e40 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
16e50 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
16e60 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
16e70 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
16e80 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
16e90 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
16ea0 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
16eb0 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
16ec0 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
16ed0 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
16ee0 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
16ef0 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
16f00 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
16f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
16f20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f30 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
16f40 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
16f50 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
16f60 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
16f70 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
16f80 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
16f90 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
16fa0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
16fb0 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
16fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
16fe0 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
16ff0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17000 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
17010 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
17020 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
17030 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
17040 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
17050 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
17060 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17070 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
17080 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
17090 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
170a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
170b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
170c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
170d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
170e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
170f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
17100 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
17110 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
17120 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
17130 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17140 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
17150 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
17160 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17170 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
17180 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
17190 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
171a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
171b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
171c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
171d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
171e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
171f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
17200 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17210 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
17220 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
17230 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
17240 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
17250 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
17270 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
17280 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
17290 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
172a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
172b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
172c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
172d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
172e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
172f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
17300 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
17310 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
17320 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
17330 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
17340 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
17350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17360 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17370 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
17380 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17390 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
173a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
173b0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
173c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
173d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
173e0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
173f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
17400 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
17410 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
17420 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
17430 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
17440 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
17450 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
17460 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
17470 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
17490 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
174a0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
174b0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
174c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
174d0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
174e0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
174f0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
17500 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
17510 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
17520 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
17530 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
17540 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
17550 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
17560 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
17570 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
17580 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
17590 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
175a0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
175b0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
175c0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
175d0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
175e0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
175f0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
17600 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
17610 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
17620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
17630 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
17640 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
17650 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
17660 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
17670 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17680 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
17690 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
176a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
176b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
176c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
176d0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
176e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
176f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17700 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
17710 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
17720 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
17730 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
17740 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
17750 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
17760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17770 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
17790 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
177a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
177b0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
177c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
177d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
177e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
177f0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
17800 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
17810 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
17820 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17830 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
17840 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
17850 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
17860 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
17870 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
17880 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
17890 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
178a0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
178b0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
178c0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
178d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
178e0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
178f0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
17900 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
17910 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
17920 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17930 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
17940 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
17950 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
17960 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
17970 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
17980 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
17990 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
179a0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
179b0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
179c0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
179d0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
179e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
179f0 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45   R-43737-39999 E
17a00 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74  very valid SQLit
17a10 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17a20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69  begins.    ** wi
17a30 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
17a40 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65   16 bytes (in he
17a50 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20  x): 53 51 4c 69 
17a60 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37  74 65 20 66 6f 7
17a70 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37  2 6d.    ** 61 7
17a80 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20  4 20 33 00. */. 
17a90 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
17aa0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
17ab0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
17ac0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17ad0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17ae0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17af0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
17b00 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
17b10 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
17b20 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
17b30 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
17b40 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
17b50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17b60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17b70 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
17b80 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
17b90 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
17ba0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
17bb0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
17bc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17bd0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
17be0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17bf0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
17c00 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
17c10 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
17c20 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
17c30 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
17c40 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
17c50 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
17c60 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
17c70 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
17c80 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
17c90 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
17ca0 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
17cb0 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
17cc0 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
17cd0 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
17ce0 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
17cf0 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
17d00 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
17d10 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
17d20 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
17d30 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
17d40 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
17d50 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
17d60 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
17d70 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
17d80 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
17d90 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
17da0 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
17db0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
17dc0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17dd0 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
17de0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
17df0 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
17e00 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
17e10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17e20 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
17e30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
17e40 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
17e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17e60 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
17e70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17e80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
17e90 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17ea0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
17eb0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
17ec0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20  L_SYNCHRONOUS.  
17ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
17ee0 62 3b 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70  b;.        Db *p
17ef0 44 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Db;.        if( 
17f00 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
17f10 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
17f20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17f30 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
17f40 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
17f50 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
17f60 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
17f70 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
17f80 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  t==0.           
17f90 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
17fa0 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46  evel==SQLITE_DEF
17fb0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
17fc0 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  +1.          ){.
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
17fe0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
17ff0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18000 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
18010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
18020 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
18030 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18050 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18060 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18070 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18080 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
18090 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
180a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
180b0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
180c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
180d0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
180e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
180f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
18100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
18110 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
18120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18130 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18140 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18150 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18160 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18170 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18180 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18190 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
181a0 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
181b0 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
181c0 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
181d0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
181e0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
181f0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
18200 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
18210 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
18220 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
18230 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18240 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18250 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18260 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18270 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18280 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18290 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
182a0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
182b0 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
182c0 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
182d0 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
182e0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
182f0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18300 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
18310 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
18320 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
18330 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18340 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18360 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
18370 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
18380 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
18390 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
183a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
183b0 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
183c0 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
183d0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
183e0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
183f0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
18400 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
18410 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
18420 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
18430 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
18440 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
18450 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
18460 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
18470 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18480 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
184a0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
184b0 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
184c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
184d0 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
184e0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
184f0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
18500 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
18510 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
18520 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18530 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
18540 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
18550 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
18560 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
18570 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
18580 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
18590 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
185a0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
185b0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
185c0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
185d0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
185e0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
185f0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
18600 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
18610 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
18620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
18630 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
18640 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
18650 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
18660 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
18670 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
18680 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
18690 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
186a0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
186b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
186c0 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
186d0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
186e0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
186f0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
18700 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
18710 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
18720 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
18730 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
18740 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
18750 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
18760 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
18770 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18780 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
18790 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
187a0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
187b0 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
187c0 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
187d0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
187e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
187f0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
18800 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
18810 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
18820 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
18830 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
18840 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
18850 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
18860 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
18870 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
18880 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
18890 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188b0 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
188c0 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
188d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
188e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
188f0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
18900 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
18910 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
18920 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
18930 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18940 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
18950 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18960 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18970 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18980 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
18990 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
189a0 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
189b0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
189c0 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
189d0 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
189e0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
189f0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
18a00 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18a10 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
18a20 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
18a30 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
18a40 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
18a50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18a60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18a70 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
18a80 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
18a90 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
18aa0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
18ab0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
18ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18ad0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
18ae0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
18af0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
18b00 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
18b10 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
18b20 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
18b30 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
18b40 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
18b50 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
18b60 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
18b70 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
18b80 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
18b90 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
18ba0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
18bb0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
18bc0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
18bd0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
18be0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
18bf0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
18c00 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
18c10 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
18c20 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
18c30 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
18c40 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
18c50 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
18c60 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
18c70 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
18c80 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
18c90 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
18ca0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
18cb0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
18cc0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
18cd0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
18ce0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
18cf0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
18d00 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
18d10 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
18d20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
18d30 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
18d40 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
18d50 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
18d60 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
18d70 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
18d80 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
18d90 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
18da0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
18db0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
18dc0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
18dd0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
18de0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
18df0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18e00 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
18e10 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
18e20 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
18e30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
18e40 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
18e50 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
18e60 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18e70 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
18e80 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
18e90 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
18ea0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
18eb0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
18ec0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18ed0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
18ee0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
18ef0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
18f00 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
18f10 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
18f20 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
18f30 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
18f40 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
18f50 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
18f60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
18f70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
18f80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
18f90 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
18fa0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
18fb0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
18fc0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
18fd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18fe0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
18ff0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19000 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19010 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19020 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19030 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19040 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19050 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19060 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19070 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19080 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19090 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
190a0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
190b0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
190c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
190d0 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
190e0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
190f0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19100 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19110 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19120 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19130 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19140 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19150 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19160 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19170 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19180 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19190 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
191a0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
191b0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
191c0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
191d0 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
191e0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
191f0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
19200 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
19210 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
19220 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
19230 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19240 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19250 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19260 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19270 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19280 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19290 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
192a0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
192b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
192c0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
192d0 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
192e0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
192f0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
19300 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
19310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
19320 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
19330 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19340 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19360 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
19370 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
19380 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
19390 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
193a0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
193b0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
193c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
193d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
193e0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
193f0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
19400 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
19420 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
19430 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19440 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
19450 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
19460 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
19470 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
19480 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
19490 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
194a0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
194b0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
194c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
194d0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
194e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
194f0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
19500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19510 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19520 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
19530 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
19540 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
19550 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
19560 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
19570 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
19580 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
19590 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
195a0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
195b0 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
195c0 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
195d0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
195e0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
195f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
19600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
19610 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
19620 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
19630 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
19640 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
19650 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
19660 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19670 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19680 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
19690 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
196a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
196b0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
196c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
196d0 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
196e0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
196f0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
19700 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
19710 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
19720 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19730 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
19740 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
19750 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19760 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
19770 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
19780 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
19790 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
197a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
197b0 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
197c0 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
197d0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
197e0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
197f0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
19800 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
19810 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
19820 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
19830 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
19840 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
19850 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
19860 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
19870 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
19880 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
19890 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
198a0 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
198b0 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
198c0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
198d0 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
198e0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
198f0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
19900 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
19910 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
19920 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
19930 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
19940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19950 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
19960 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
19970 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
19980 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
19990 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
199a0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
199b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
199c0 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
199d0 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
199e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
199f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
19a00 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
19a10 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
19a20 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
19a30 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
19a40 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
19a50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19a60 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
19a70 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
19a80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19a90 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
19aa0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
19ab0 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
19ac0 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
19ad0 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
19ae0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
19af0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
19b00 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
19b10 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
19b20 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
19b30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
19b40 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19b50 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19b60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19b70 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
19b80 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
19b90 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
19ba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19bb0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19bc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
19bd0 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
19be0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
19bf0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19c00 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
19c10 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
19c20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
19c30 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
19c40 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
19c50 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
19c60 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19c70 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
19c80 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
19c90 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19ca0 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
19cb0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
19cc0 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
19cd0 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
19ce0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
19cf0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
19d00 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
19d10 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
19d20 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
19d30 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
19d40 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
19d50 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
19d60 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
19d70 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
19d80 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
19d90 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19da0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
19db0 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
19dc0 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
19dd0 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
19de0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
19df0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
19e00 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
19e10 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
19e20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19e30 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
19e40 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19e50 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
19e60 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19e70 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
19e80 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
19e90 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
19ea0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19eb0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
19ec0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19ed0 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
19ee0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19ef0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
19f00 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19f10 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
19f20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
19f30 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
19f40 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
19f50 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
19f60 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
19f70 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
19f80 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
19f90 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
19fa0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
19fb0 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
19fc0 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
19fd0 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
19fe0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
19ff0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1a000 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1a010 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1a020 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1a030 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1a040 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1a050 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a060 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1a070 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1a080 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1a090 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1a0a0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1a0b0 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1a0c0 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1a0d0 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1a0e0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1a0f0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1a100 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1a110 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1a120 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1a130 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1a140 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1a150 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1a160 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1a170 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1a180 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1a190 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1a1a0 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1a1b0 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1a1c0 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1a1d0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1a1e0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1a1f0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1a200 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1a210 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1a220 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1a230 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1a240 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1a250 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1a260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1a270 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1a280 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1a290 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a2a0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1a2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a2c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1a2d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1a2e0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1a2f0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1a300 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1a310 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1a320 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1a330 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1a340 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1a350 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1a360 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1a370 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1a380 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1a390 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a3a0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1a3b0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1a3c0 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1a3d0 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1a3e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a3f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1a400 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a410 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1a420 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1a430 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1a440 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a450 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1a460 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1a470 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1a480 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1a490 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a4a0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1a4b0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1a4c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a4d0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1a4e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a4f0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a500 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1a510 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1a520 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1a530 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1a540 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1a550 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1a560 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1a570 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1a580 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1a590 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1a5a0 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1a5b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1a5c0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1a5d0 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1a5e0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1a5f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1a600 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1a610 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a620 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1a630 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a640 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1a650 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1a660 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1a670 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1a680 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1a690 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1a6a0 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1a6b0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1a6c0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1a6d0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1a6e0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1a6f0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1a700 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1a710 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1a720 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1a730 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1a740 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a750 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1a760 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1a770 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1a780 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1a790 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a7a0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1a7b0 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1a7c0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1a7d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a7e0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1a7f0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1a800 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1a810 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1a820 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1a830 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1a840 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1a850 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1a860 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1a870 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1a880 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a890 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1a8a0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1a8b0 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1a8c0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1a8d0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1a8e0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1a8f0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1a900 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1a910 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1a920 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a930 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1a940 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1a950 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1a960 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1a970 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1a980 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1a990 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1a9a0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1a9b0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1a9c0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1a9d0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1a9e0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1a9f0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1aa00 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1aa10 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1aa20 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1aa30 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1aa40 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1aa50 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1aa60 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1aa70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1aa80 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1aa90 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1aaa0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1aab0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1aac0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1aad0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1aae0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1aaf0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1ab00 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1ab10 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1ab20 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1ab30 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1ab40 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1ab50 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1ab60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1ab70 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1ab80 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1ab90 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1aba0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1abb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1abc0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1abd0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1abe0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1abf0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1ac00 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1ac10 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1ac20 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1ac30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ac40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ac50 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1ac60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ac70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1ac80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ac90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1aca0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1acb0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1acc0 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1acd0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ace0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1acf0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1ad00 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1ad10 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1ad20 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1ad30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad40 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1ad50 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1ad60 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1ad70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1ad80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ad90 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ada0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1adb0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1adc0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1add0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1ade0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1adf0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1ae00 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1ae10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1ae20 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1ae30 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1ae40 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1ae50 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1ae60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1ae70 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1ae80 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1ae90 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1aea0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1aeb0 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1aec0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1aed0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1aee0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1aef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1af00 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1af10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1af20 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1af30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1af40 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1af50 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1af60 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1af70 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1af80 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1af90 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1afa0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1afb0 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1afc0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1afd0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1afe0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1aff0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1b000 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1b010 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1b020 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1b030 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1b040 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1b050 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1b060 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1b070 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1b080 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1b090 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1b0a0 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1b0b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1b0c0 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1b0d0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1b0e0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1b0f0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1b100 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1b110 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1b120 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1b130 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1b140 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1b150 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1b160 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1b170 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1b180 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1b190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1b1a0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1b1b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1b1c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1b1e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1b1f0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1b200 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1b210 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b220 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1b230 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1b240 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1b250 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1b260 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1b270 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1b280 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1b290 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1b2a0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1b2b0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1b2c0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1b2d0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1b2e0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1b2f0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1b300 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1b310 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1b320 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1b330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b340 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1b350 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1b360 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b370 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1b380 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1b390 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b3a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b3b0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b3c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b3d0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1b3e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1b3f0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1b400 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1b410 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1b420 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1b430 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1b440 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1b450 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1b460 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1b470 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1b480 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1b490 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1b4a0 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1b4b0 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1b4c0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1b4f0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1b500 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b530 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1b540 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1b550 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b570 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b580 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b590 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1b5a0 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
1b5b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
1b5c0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1b5d0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1b5e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b5f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1b600 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b610 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1b620 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1b630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b640 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
1b650 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1b660 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
1b670 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1b680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1b690 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1b6a0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1b6b0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1b6c0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1b6d0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1b6e0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1b6f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1b700 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1b710 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1b720 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1b730 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1b740 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1b750 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1b760 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1b770 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1b780 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1b790 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1b7a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1b7b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1b7c0 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1b7d0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1b7e0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1b7f0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1b800 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
1b810 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
1b820 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1b830 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
1b840 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1b850 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1b860 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1b870 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1b880 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1b890 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1b8a0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1b8b0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1b8c0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1b8d0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1b8e0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1b8f0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1b900 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1b910 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1b920 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b930 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1b940 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b960 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1b970 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1b980 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1b990 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1b9a0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1b9b0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1b9c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b9d0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1b9e0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1b9f0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1ba00 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1ba10 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1ba20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1ba30 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1ba40 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1ba50 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1ba60 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1ba70 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1ba80 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1ba90 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1baa0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1bab0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1bac0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1bad0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1bae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1baf0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1bb00 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1bb10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1bb20 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1bb30 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1bb40 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1bb50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1bb60 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1bb70 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1bb80 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1bb90 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1bba0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1bbb0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1bbc0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1bbd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1bbe0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1bbf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1bc00 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1bc10 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1bc20 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
1bc30 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1bc40 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
1bc50 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1bc60 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1bc70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
1bc80 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1bc90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bca0 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1bcb0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1bcc0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1bcd0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1bce0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1bcf0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1bd00 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1bd10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bd20 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1bd30 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1bd40 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1bd50 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1bd60 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1bd70 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1bd80 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1bd90 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26  yload.         &
1bda0 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  & pCell+info.nSi
1bdb0 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ze-1<=pPage->aDa
1bdc0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1bdd0 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1bde0 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70  From==get4byte(p
1bdf0 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1be00 34 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  4).        ){.  
1be10 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1be20 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1be30 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1be40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1be60 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1be70 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1be80 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1be90 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1bea0 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1beb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bec0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bed0 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1bee0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1bef0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1bf00 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1bf10 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1bf20 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1bf30 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1bf40 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1bf50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1bf70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1bf80 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1bf90 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1bfa0 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1bfb0 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
1bfc0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1bfd0 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
1bfe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bff0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1c000 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1c010 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1c020 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1c030 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1c040 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1c050 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1c060 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1c070 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1c080 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1c090 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1c0a0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1c0b0 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1c0c0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1c0d0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1c0e0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c0f0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1c100 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1c110 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1c120 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1c130 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1c140 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1c150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c160 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1c170 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1c180 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1c190 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1c1a0 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1c1b0 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1c1c0 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1c1d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c1e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1c1f0 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1c200 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1c210 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1c220 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c230 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1c240 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1c250 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1c260 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1c270 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1c280 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1c290 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1c2a0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1c2b0 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1c2c0 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1c2d0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1c2e0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1c2f0 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1c300 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1c310 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1c320 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1c330 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1c340 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1c350 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c360 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1c370 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1c380 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1c390 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1c3a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c3b0 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1c3c0 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1c3d0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1c3e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1c400 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c410 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c420 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1c430 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1c440 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1c450 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1c460 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1c470 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1c480 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1c490 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1c4a0 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1c4b0 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1c4c0 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1c4d0 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1c4e0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1c4f0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1c500 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1c510 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1c520 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1c530 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1c540 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1c550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c560 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c570 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1c580 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1c590 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1c5a0 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1c5b0 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1c5c0 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1c5d0 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1c5e0 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1c5f0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1c600 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1c610 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1c620 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1c630 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1c640 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1c650 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1c660 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1c670 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1c680 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1c690 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1c6a0 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1c6b0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1c6c0 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1c6d0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1c6e0 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1c6f0 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1c700 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1c710 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1c720 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1c730 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1c740 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c750 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c760 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1c770 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1c780 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1c790 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c7a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c7b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1c7c0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1c7d0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1c7e0 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1c7f0 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1c800 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1c810 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1c820 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1c830 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1c840 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1c850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c860 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1c870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1c880 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1c890 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1c8a0 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1c8b0 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1c8c0 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1c8d0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1c8e0 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1c8f0 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1c900 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1c910 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1c920 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1c930 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1c940 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1c950 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1c960 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1c970 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
1c980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c9a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c9b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c9c0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1c9d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1c9e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c9f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ca00 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1ca10 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1ca20 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ca30 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
1ca40 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
1ca50 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
1ca60 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
1ca70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ca80 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1ca90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1caa0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1cab0 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
1cac0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1cad0 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
1cae0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1caf0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1cb00 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
1cb10 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
1cb20 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
1cb30 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1cb40 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
1cb50 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
1cb60 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
1cb70 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
1cb80 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
1cb90 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
1cba0 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
1cbb0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
1cbc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
1cbd0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
1cbe0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
1cbf0 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
1cc00 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
1cc10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1cc20 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
1cc30 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
1cc40 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
1cc50 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
1cc60 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1cc70 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
1cc80 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
1cc90 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1cca0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
1ccb0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1ccc0 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
1ccd0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
1cce0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
1ccf0 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
1cd00 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
1cd10 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
1cd20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1cd30 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
1cd40 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
1cd50 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
1cd60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1cd70 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
1cd80 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1cd90 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1cda0 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
1cdb0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1cdc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
1cdd0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
1cde0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
1cdf0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
1ce00 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
1ce10 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1ce20 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
1ce30 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
1ce40 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
1ce50 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1ce60 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
1ce70 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
1ce80 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
1ce90 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1cea0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1ceb0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
1cec0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1ced0 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
1cee0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
1cef0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
1cf00 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1cf10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1cf20 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
1cf30 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
1cf40 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1cf50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1cf60 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1cf70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1cf80 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
1cf90 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
1cfa0 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1cfb0 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
1cfc0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1cfd0 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
1cfe0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
1cff0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
1d000 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
1d010 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d020 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1d030 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
1d040 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1d050 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
1d060 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
1d070 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
1d080 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
1d090 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
1d0a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d0b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d0c0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1d0d0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d0e0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d0f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d100 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d110 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
1d120 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1d130 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
1d140 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1d150 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
1d160 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
1d170 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
1d180 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
1d190 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
1d1a0 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
1d1b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
1d1c0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
1d1d0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
1d1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
1d1f0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
1d200 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1d210 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
1d220 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
1d230 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
1d240 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
1d250 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
1d260 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
1d270 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d280 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d290 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1d2a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1d2b0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d2c0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1d2d0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
1d2e0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
1d2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d310 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d320 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1d340 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
1d350 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1d360 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1d370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1d380 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
1d390 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
1d3a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1d3b0 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
1d3c0 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
1d3d0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
1d3e0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
1d3f0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
1d400 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
1d410 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
1d420 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d430 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
1d440 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
1d450 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
1d460 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d470 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d480 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
1d490 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1d4a0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
1d4b0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
1d4c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d4d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1d4e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1d4f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
1d500 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
1d510 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
1d520 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
1d530 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
1d540 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
1d550 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
1d560 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
1d570 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
1d580 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
1d590 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
1d5a0 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
1d5b0 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
1d5c0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
1d5d0 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
1d5e0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
1d5f0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
1d600 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
1d610 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
1d620 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1d630 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
1d640 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
1d650 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1d660 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
1d670 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
1d680 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
1d690 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
1d6a0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1d6b0 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1d6c0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1d6d0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1d6e0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1d6f0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
1d700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d720 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d730 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1d740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d760 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d770 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1d780 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
1d790 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
1d7a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d7b0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
1d7c0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
1d7d0 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
1d7e0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
1d7f0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1d800 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
1d810 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
1d820 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d830 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d860 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d870 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
1d880 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
1d890 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
1d8a0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
1d8b0 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
1d8c0 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
1d8d0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d8e0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
1d8f0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1d900 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
1d910 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
1d920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1d930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d940 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
1d950 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
1d960 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1d970 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1d980 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
1d990 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
1d9a0 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
1d9b0 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
1d9c0 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
1d9d0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1d9e0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1d9f0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
1da00 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
1da10 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1da20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
1da30 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1da40 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
1da50 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
1da60 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
1da70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1da80 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1da90 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1daa0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1dab0 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1dac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dad0 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1dae0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1daf0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1db20 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1db30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1db40 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1db50 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1db60 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1db70 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1db80 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1db90 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1dba0 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1dbb0 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1dbc0 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1dbd0 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1dbe0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1dbf0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1dc00 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1dc10 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1dc20 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1dc30 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dc40 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1dc50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1dc60 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1dc70 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1dc80 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1dc90 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1dca0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1dcb0 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1dcc0 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1dcd0 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1dce0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1dcf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1dd00 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1dd10 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1dd20 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1dd30 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1dd40 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1dd50 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1dd60 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1dd70 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1dd80 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1dd90 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1dda0 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1ddb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1ddc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ddd0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1dde0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1ddf0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1de00 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1de10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1de20 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1de30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1de40 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1de50 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1de60 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1de70 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1de80 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1de90 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1dea0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1deb0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1dec0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1ded0 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1dee0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1def0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1df00 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1df10 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1df20 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1df30 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1df40 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1df50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1df60 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1df70 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1df80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1df90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1dfa0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1dfb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dfc0 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1dfd0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1dfe0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1dff0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1e000 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1e010 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1e020 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e060 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e070 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1e080 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e090 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1e0a0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1e0b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1e0c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e0d0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1e0e0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1e0f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e110 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e120 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1e130 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1e140 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1e150 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1e160 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1e170 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e180 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1e190 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e1a0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1e1b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1e1c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1e1d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1e1e0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1e1f0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1e200 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1e210 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1e220 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1e230 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1e240 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1e250 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1e260 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1e270 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1e280 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1e290 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1e2a0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1e2b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1e2c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1e2d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1e2e0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1e2f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1e300 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
1e310 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e320 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e330 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e340 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1e350 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1e360 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1e370 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1e380 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1e390 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1e3a0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1e3b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e3c0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1e3d0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1e3e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1e3f0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1e400 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1e410 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1e420 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1e430 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1e440 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1e450 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1e460 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1e470 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e480 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1e490 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1e4a0 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1e4b0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1e4c0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1e4d0 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1e4e0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1e4f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e500 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1e510 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1e520 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1e530 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1e540 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1e550 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1e560 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1e570 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1e580 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1e590 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1e5a0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1e5b0 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1e5c0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1e5d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e5e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e5f0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1e600 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1e610 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e620 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1e630 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e640 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e650 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1e660 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1e670 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e680 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1e690 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1e6a0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1e6b0 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e6c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1e6d0 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1e6e0 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1e6f0 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1e700 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1e710 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1e720 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1e730 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e740 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1e750 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1e760 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1e770 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e780 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e790 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e7a0 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1e7b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e7c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1e7d0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e7e0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e7f0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1e800 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e810 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e820 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1e830 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1e840 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1e850 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1e860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e890 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1e8a0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1e8b0 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1e8c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e8d0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1e8e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e8f0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1e900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e910 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1e920 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1e930 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1e940 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1e950 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1e960 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1e970 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1e980 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1e990 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1e9a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1e9b0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1e9c0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1e9d0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1e9e0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1e9f0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1ea00 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1ea10 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1ea20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1ea30 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1ea40 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1ea50 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1ea60 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1ea70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1ea80 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1ea90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1eaa0 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1eab0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1eac0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1ead0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1eae0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1eaf0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1eb00 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1eb10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1eb20 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1eb30 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1eb40 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1eb50 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1eb60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1eb70 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1eb80 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1eb90 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1eba0 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1ebb0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1ebc0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1ebd0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1ebe0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ebf0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1ec00 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1ec10 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1ec20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1ec30 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1ec40 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1ec50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1ec60 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1ec70 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1ec80 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1ec90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eca0 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1ecb0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1ecc0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1ecd0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1ece0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1ecf0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1ed00 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1ed10 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1ed20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1ed30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1ed40 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ed50 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1ed60 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1ed70 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1ed80 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1ed90 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1eda0 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1edb0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1edc0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1edd0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1ede0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1edf0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1ee00 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1ee10 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1ee20 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1ee30 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1ee40 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1ee50 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1ee60 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1ee70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ee80 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1ee90 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1eea0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1eeb0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1eec0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1eed0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1eee0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1eef0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ef00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1ef10 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ef20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ef30 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1ef40 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1ef50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1ef60 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1ef70 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1ef80 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1ef90 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1efa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1efb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1efc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1efd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1efe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1eff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f000 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1f010 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1f020 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1f030 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1f040 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1f050 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f070 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1f080 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1f090 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1f0a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f0b0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1f0c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f0e0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1f0f0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1f100 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1f110 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1f120 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1f130 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1f140 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1f150 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1f160 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1f170 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1f180 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1f190 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1f1a0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1f1b0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1f1c0 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1f1d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f1e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1f1f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1f200 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1f210 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1f220 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1f230 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1f240 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1f250 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1f260 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1f270 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1f280 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1f290 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1f2a0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1f2b0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1f2c0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1f2d0 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1f2e0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1f2f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1f300 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1f310 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f320 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1f330 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f340 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1f350 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1f360 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1f370 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1f380 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1f390 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1f3a0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1f3b0 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1f3c0 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1f3d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1f3e0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1f3f0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1f400 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1f410 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1f420 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1f430 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1f440 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1f450 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1f460 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1f470 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1f480 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1f490 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1f4a0 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1f4b0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1f4c0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1f4d0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1f4e0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1f4f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1f500 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f510 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f520 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1f530 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1f540 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1f550 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1f560 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1f570 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1f580 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1f590 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1f5a0 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1f5b0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f5c0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1f5d0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f5e0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f5f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f600 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1f610 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f620 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1f630 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1f640 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1f650 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1f660 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1f670 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1f680 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1f690 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1f6a0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1f6b0 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1f6c0 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1f6d0 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1f6e0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1f6f0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1f700 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f710 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1f720 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1f730 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1f740 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1f750 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1f760 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1f770 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1f780 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1f790 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1f7a0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1f7b0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1f7c0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1f7d0 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1f7e0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1f7f0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1f800 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1f810 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1f820 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1f830 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1f840 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1f850 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f860 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f870 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1f880 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1f890 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1f8a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1f8b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1f8c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f8d0 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1f8e0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1f8f0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1f900 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1f910 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1f920 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1f930 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1f940 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1f950 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1f960 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1f970 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1f980 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1f990 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1f9a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1f9b0 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1f9c0 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1f9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1f9e0 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1f9f0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1fa00 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1fa10 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1fa20 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1fa30 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1fa40 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1fa50 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1fa60 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1fa70 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1fa80 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1fa90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1faa0 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1fab0 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1fac0 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1fad0 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1fae0 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1faf0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1fb00 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1fb10 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1fb20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1fb30 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1fb40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1fb50 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1fb60 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1fb70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1fb80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fb90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1fba0 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1fbb0 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1fbc0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1fbd0 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1fbe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1fbf0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1fc00 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1fc10 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1fc20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1fc30 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1fc40 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1fc50 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1fc60 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1fc70 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1fc80 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1fc90 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1fca0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1fcb0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fcc0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1fcd0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1fce0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1fcf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1fd00 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1fd10 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1fd20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1fd30 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1fd40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fd50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1fd60 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1fd70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fd80 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1fd90 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1fda0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fdb0 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1fdc0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1fdd0 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
1fde0 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
1fdf0 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
1fe00 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
1fe10 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1fe20 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1fe30 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1fe40 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1fe50 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1fe60 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1fe70 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1fe80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1fe90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fea0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1feb0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1fec0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1fed0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1fee0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1fef0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1ff00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1ff10 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1ff20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1ff30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1ff40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ff50 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ff60 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1ff70 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
1ff80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ff90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ffa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ffb0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1ffc0 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1ffd0 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1ffe0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1fff0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
20000 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
20010 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
20020 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
20030 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
20040 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
20050 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
20060 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
20070 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
20080 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
20090 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
200a0 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
200b0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
200c0 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
200d0 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
200e0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
200f0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
20100 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
20110 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
20120 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
20130 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
20140 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20150 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
20160 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
20170 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
20180 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
20190 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
201a0 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
201b0 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
201c0 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
201d0 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
201e0 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
201f0 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
20200 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
20210 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
20220 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
20230 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20240 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
20250 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
20260 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
20270 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
20280 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
20290 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
202a0 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
202b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
202c0 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
202d0 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
202e0 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
202f0 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
20300 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20310 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
20320 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
20330 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
20340 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
20350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
20360 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
20370 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
20380 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
20390 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
203a0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
203b0 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
203c0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
203d0 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
203e0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
203f0 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
20400 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
20410 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20420 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
20430 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
20440 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
20450 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
20460 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
20470 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20480 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20490 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
204a0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
204b0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
204c0 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
204d0 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
204e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
204f0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
20500 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
20510 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
20520 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
20530 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
20540 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
20550 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
20560 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
20570 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
20580 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
20590 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
205a0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
205b0 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
205c0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
205d0 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
205e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
205f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20600 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
20610 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
20620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
20630 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
20640 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
20650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20670 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
20680 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
20690 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
206a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
206b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
206c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
206d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
206e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
206f0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
20700 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
20710 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
20720 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
20730 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
20740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
20750 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
20760 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
20770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
20780 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20790 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
207a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
207b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
207c0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
207d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
207e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
207f0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
20800 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
20810 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
20820 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
20830 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
20840 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
20850 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
20860 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
20870 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
20880 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
20890 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
208a0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
208b0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
208c0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
208d0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
208e0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
208f0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
20900 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
20910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
20920 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
20930 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
20940 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
20950 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
20960 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
20970 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
20980 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
20990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
209a0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
209b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
209c0 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
209d0 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
209e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
209f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
20a00 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
20a10 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
20a20 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
20a30 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
20a40 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20a50 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
20a60 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
20a70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
20a80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20a90 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
20aa0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
20ab0 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
20ac0 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
20ad0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20ae0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
20af0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
20b00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
20b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20b20 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
20b30 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
20b40 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20b50 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
20b60 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
20b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20b80 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
20b90 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
20ba0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
20bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20bc0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20bd0 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
20be0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
20bf0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20c00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
20c10 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
20c20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
20c30 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
20c40 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
20c50 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
20c60 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
20c70 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20c80 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20c90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20ca0 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
20cb0 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
20cc0 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
20cd0 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
20ce0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
20cf0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
20d00 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
20d10 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
20d20 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
20d30 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
20d40 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
20d50 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
20d60 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
20d70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
20d80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
20d90 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
20da0 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
20db0 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
20dc0 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
20dd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
20de0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
20df0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20e00 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
20e10 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
20e20 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
20e30 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
20e40 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20e50 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
20e60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
20e70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20e80 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
20e90 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
20ea0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
20eb0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20ec0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20ed0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20ee0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20ef0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20f00 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20f10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20f20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20f30 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
20f40 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
20f50 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
20f60 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
20f70 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
20f80 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
20f90 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
20fa0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
20fb0 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
20fc0 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
20fd0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
20fe0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
20ff0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
21000 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
21010 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
21020 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
21030 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
21040 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
21050 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21060 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
21070 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
21080 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
21090 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
210a0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
210b0 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
210c0 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
210d0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
210e0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
210f0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
21100 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
21110 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
21120 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
21130 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
21140 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
21150 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21160 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
21170 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
21180 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
21190 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
211a0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
211b0 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
211c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
211d0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
211e0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
211f0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
21200 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
21210 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
21220 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
21230 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
21240 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
21250 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
21260 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
21270 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
21280 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
21290 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
212a0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
212b0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
212c0 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
212d0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
212e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
212f0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21300 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
21310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21320 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
21330 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
21340 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
21350 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21360 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
21370 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
21390 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
213a0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
213b0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
213c0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
213d0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
213e0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
213f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21400 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
21410 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
21420 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
21430 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21440 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
21450 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
21460 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
21470 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
21480 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
21490 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
214a0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
214b0 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
214c0 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
214d0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
214e0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
214f0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
21500 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
21510 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
21520 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
21530 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
21540 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
21550 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
21560 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
21570 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
21580 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21590 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
215a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
215b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
215c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
215d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
215e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
215f0 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
21600 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21610 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
21620 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
21630 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
21640 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
21650 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
21660 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
21670 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
21680 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
21690 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
216a0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
216b0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
216c0 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
216d0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
216e0 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
216f0 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
21700 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
21710 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
21720 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
21730 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
21740 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
21750 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
21760 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
21770 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
21780 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
21790 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
217a0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
217b0 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
217c0 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
217d0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
217e0 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
217f0 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
21800 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
21810 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
21820 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
21830 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
21850 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
21860 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21870 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
21880 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21890 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
218a0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
218b0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
218c0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
218d0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
218e0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
218f0 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
21900 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
21910 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
21920 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21930 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21940 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
21950 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
21960 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
21970 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21990 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
219a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
219b0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
219c0 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
219d0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
219e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
219f0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
21a00 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
21a10 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
21a20 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
21a30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
21a40 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
21a50 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
21a60 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
21a70 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
21a80 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
21a90 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
21aa0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
21ab0 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
21ac0 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
21ad0 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
21ae0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
21af0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21b00 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
21b10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
21b20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21b30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21b40 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
21b50 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
21b60 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
21b70 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
21b80 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
21b90 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
21ba0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
21bb0 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
21bc0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
21bd0 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
21be0 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
21bf0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21c00 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
21c10 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
21c20 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
21c30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21c40 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
21c50 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
21c60 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
21c70 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21c80 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
21c90 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
21ca0 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
21cb0 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
21cc0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
21cd0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21ce0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
21cf0 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
21d00 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
21d10 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
21d20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
21d30 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
21d40 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
21d50 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
21d60 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
21d70 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
21d80 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
21d90 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
21da0 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
21db0 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
21dc0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
21dd0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
21de0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
21df0 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
21e00 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
21e10 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
21e20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21e30 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
21e40 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
21e50 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
21e60 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
21e70 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
21e80 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
21e90 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
21ea0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
21eb0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
21ec0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
21ed0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
21ee0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
21ef0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
21f00 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
21f10 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
21f20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
21f30 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
21f40 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21f50 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
21f60 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
21f70 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
21f80 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
21f90 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
21fa0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
21fb0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
21fc0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
21fd0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
21fe0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
21ff0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
22000 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
22010 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
22020 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
22030 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
22040 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
22050 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
22060 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
22070 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
22080 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
22090 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
220a0 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
220b0 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
220c0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
220d0 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
220e0 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
220f0 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
22100 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
22110 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
22120 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
22130 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
22140 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
22150 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
22160 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
22170 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
22180 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
22190 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
221a0 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
221b0 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
221c0 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
221d0 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
221e0 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
221f0 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
22200 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
22210 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
22220 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
22230 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
22240 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
22250 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
22260 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
22270 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
22280 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
22290 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
222a0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
222b0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
222c0 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
222d0 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
222e0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
222f0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
22300 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
22310 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
22320 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
22330 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
22340 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
22350 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
22360 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
22370 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
22380 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
22390 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
223a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
223b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223c0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
223d0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22400 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22410 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22420 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
22450 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
22460 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
22470 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
22480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22490 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
224a0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
224b0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
224c0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
224d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
224e0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
224f0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
22500 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22510 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
22520 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
22530 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
22540 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
22570 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
22580 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
22590 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
225a0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
225b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
225c0 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
225d0 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
225e0 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
225f0 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
22600 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
22610 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
22620 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
22630 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
22640 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
22650 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
22660 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
22670 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
22680 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
22690 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
226a0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
226b0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
226c0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
226d0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
226e0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
226f0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
22700 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
22710 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
22720 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
22730 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
22740 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
22750 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
22760 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22770 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
22780 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
22790 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
227a0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
227b0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
227c0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
227d0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
227e0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
227f0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
22800 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22810 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
22820 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
22830 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
22840 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
22850 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
22860 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22870 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
22880 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22890 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
228a0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
228b0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
228c0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
228d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
228e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
228f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
22900 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
22910 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
22920 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
22930 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22940 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
22950 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22960 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
22970 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
22980 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
22990 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
229a0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
229b0 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
229c0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
229d0 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
229e0 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
229f0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
22a00 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
22a10 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
22a20 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
22a30 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
22a40 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
22a50 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
22a60 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
22a70 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
22a80 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
22a90 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
22aa0 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
22ab0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22ac0 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
22ad0 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
22ae0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
22af0 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
22b00 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
22b10 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
22b20 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
22b30 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
22b40 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
22b50 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
22b60 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
22b70 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
22b80 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
22b90 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
22ba0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
22bb0 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
22bc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
22bd0 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
22be0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
22bf0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
22c00 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
22c10 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
22c20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22c30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
22c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c50 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
22c60 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
22c70 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22ca0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
22cb0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
22ce0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
22cf0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
22d00 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
22d30 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
22d40 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
22d50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22d70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
22d80 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
22d90 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22da0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dc0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
22dd0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
22de0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
22df0 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
22e00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22e10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
22e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
22e30 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
22e40 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
22e50 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
22e60 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
22e70 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
22e80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
22e90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22eb0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
22ec0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
22ed0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
22ee0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
22ef0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
22f00 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
22f10 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
22f20 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
22f30 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
22f40 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
22f50 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
22f60 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
22f70 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
22f80 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
22f90 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
22fa0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
22fb0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
22fc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22fd0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
22fe0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
22ff0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
23000 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
23010 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
23020 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
23030 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
23040 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23050 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
23060 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
23070 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
23080 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
23090 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
230a0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
230b0 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
230c0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
230d0 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
230e0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
230f0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
23100 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
23110 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
23120 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
23130 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
23140 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
23150 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
23160 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23170 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
23180 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
23190 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
231a0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
231b0 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
231c0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
231d0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
231e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
231f0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
23200 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
23210 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
23220 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
23230 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
23240 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
23250 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
23260 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
23270 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
23280 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
23290 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
232a0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
232b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
232c0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
232d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
232e0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
232f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
23300 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
23310 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
23320 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
23330 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
23340 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
23350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23360 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
23370 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
23380 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
23390 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
233a0 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
233b0 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
233c0 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
233d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
233e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
233f0 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
23400 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
23410 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
23420 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
23430 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23440 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
23450 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
23460 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
23470 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
23480 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
23490 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
234a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
234b0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
234c0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
234d0 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
234e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
234f0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
23500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23510 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
23520 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
23530 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
23540 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
23550 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
23560 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
23570 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
23580 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
23590 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
235a0 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
235b0 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
235c0 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
235d0 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
235e0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
235f0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
23600 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
23610 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
23620 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
23630 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
23640 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ()..*/.#ifndef N
23650 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
23660 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
23670 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
23680 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
23690 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
236a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
236b0 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
236c0 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
236d0 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
236e0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
236f0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
23700 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
23710 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
23720 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
23730 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e  DB || memcmp(&in
23740 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
23750 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
23760 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
23770 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
23780 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
23790 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
237a0 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
237b0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
237c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
237d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
237e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
237f0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
23800 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  age;.    pCur->c
23810 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
23820 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
23830 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
23840 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23850 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
23860 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
23870 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23880 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
23890 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
238a0 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
238b0 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
238c0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
238d0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
238e0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
238f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
23900 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
23910 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
23920 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
23930 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
23940 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
23950 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
23960 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
23970 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
23980 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
23990 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
239a0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
239b0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
239c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
239d0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
239e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
239f0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
23a00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23a10 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
23a20 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
23a30 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
23a40 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
23a50 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
23a60 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
23a70 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
23a80 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
23a90 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
23aa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
23ab0 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
23ac0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
23ad0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
23ae0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
23af0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
23b00 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
23b10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
23b20 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
23b30 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
23b40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23b50 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
23b60 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
23b70 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
23b80 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
23b90 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
23ba0 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
23bb0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
23bc0 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
23bd0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
23be0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
23bf0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
23c00 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23c10 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
23c20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23c30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23c50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23c60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
23c70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23c80 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
23c90 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65  >info.nKey;.  re
23ca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
23cc0 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
23cd0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
23ce0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
23cf0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
23d00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
23d10 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
23d20 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
23d30 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
23d40 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23d50 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
23d60 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
23d70 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
23d80 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23d90 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
23da0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
23db0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
23dc0 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
23dd0 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
23de0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
23df0 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
23e00 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
23e10 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
23e20 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
23e30 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
23e40 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
23e50 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
23e60 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
23e70 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
23e80 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
23e90 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
23ea0 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
23eb0 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
23ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23ed0 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
23ee0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
23ef0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
23f00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23f10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23f20 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23f30 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23f40 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
23f50 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
23f60 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
23f70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23f80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23f90 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
23fa0 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
23fb0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23fc0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
23fd0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
23fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
24000 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
24010 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
24020 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
24030 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
24040 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
24050 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
24060 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24070 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
24080 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
24090 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
240a0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
240b0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
240c0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
240d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
240e0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
240f0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
24100 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
24110 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
24120 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24130 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
24140 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24150 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
24160 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
24170 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
24180 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
24190 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
241a0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
241b0 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
241c0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
241d0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
241e0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
241f0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
24200 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
24210 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
24220 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
24230 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
24240 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
24250 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
24260 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
24270 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
24280 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
24290 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
242a0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
242b0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
242c0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
242d0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
242e0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
242f0 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
24300 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
24310 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
24320 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
24330 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
24340 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
24350 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
24360 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
24370 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
24380 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
24390 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
243a0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
243b0 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
243c0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
243d0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
243e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
243f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
24400 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
24410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
24420 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
24430 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
24440 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
24450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24460 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
24470 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
24480 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
24490 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
244a0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
244b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
244c0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
244d0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
244e0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
244f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24500 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
24510 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24520 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
24530 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
24540 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
24550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24560 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
24570 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
24580 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
24590 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
245a0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
245b0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
245c0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
245d0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
245e0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
245f0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
24600 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
24610 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
24620 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
24630 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
24640 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
24650 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
24660 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
24670 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
24680 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
24690 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
246a0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
246b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
246c0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
246d0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
246e0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
246f0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
24700 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
24710 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
24720 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
24730 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
24740 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
24750 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
24760 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
24770 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
24780 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
24790 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
247a0 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
247b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
247c0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
247d0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
247e0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
247f0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
24800 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
24810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
24820 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
24830 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24840 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
24850 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
24860 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
24870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24880 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
24890 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
248a0 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
248b0 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
248c0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
248d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
248e0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
248f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
24900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24910 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
24920 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
24930 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
24940 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
24950 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
24960 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
24970 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
24980 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
24990 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
249a0 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
249b0 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
249c0 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
249d0 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
249e0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
249f0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
24a00 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
24a10 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
24a20 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
24a30 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
24a40 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
24a50 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
24a60 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
24a70 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
24a80 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
24a90 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
24aa0 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
24ab0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
24ac0 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
24ad0 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
24ae0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
24af0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
24b00 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
24b10 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
24b20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24b30 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
24b40 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
24b50 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
24b60 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24b70 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
24b80 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
24b90 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
24ba0 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
24bb0 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
24bc0 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
24bd0 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
24be0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
24bf0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
24c00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24c10 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
24c20 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
24c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24c40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
24c50 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
24c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c70 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
24c80 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
24c90 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
24ca0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
24cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24cc0 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
24cd0 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
24ce0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
24cf0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24d00 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
24d10 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
24d20 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
24d30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24d40 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24d50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
24d70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24d80 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
24d90 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
24da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
24db0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
24dc0 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
24dd0 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
24de0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
24df0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
24e00 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
24e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24e30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24e40 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
24e50 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
24e60 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
24e70 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
24e80 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
24e90 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
24ea0 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
24eb0 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
24ec0 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
24ed0 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24ee0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24ef0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24f00 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24f10 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24f20 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24f30 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24f40 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24f50 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
24f60 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
24f70 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
24f80 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24f90 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
24fa0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
24fb0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
24fc0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
24fd0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
24fe0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
24ff0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
25000 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
25010 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
25020 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
25030 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
25040 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
25050 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
25060 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
25070 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
25080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25090 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
250a0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
250b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
250c0 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
250d0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
250e0 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
250f0 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
25100 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
25110 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
25120 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
25130 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
25140 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
25150 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
25160 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25170 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
25180 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
25190 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
251a0 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
251b0 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
251c0 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
251d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
251e0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
251f0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
25200 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
25210 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
25220 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
25230 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
25240 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
25250 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
25260 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
25270 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
25280 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
25290 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
252a0 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
252b0 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
252c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
252d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
252e0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
252f0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
25300 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
25310 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
25320 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
25330 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
25340 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
25350 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
25360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
25370 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
25380 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25390 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
253a0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
253b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
253c0 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
253d0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
253e0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
253f0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
25400 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
25410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
25420 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
25430 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
25440 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
25450 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
25460 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
25470 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
25480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
25490 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
254a0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
254b0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
254c0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
254d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
254e0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
254f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
25500 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
25510 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25520 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
25530 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
25540 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
25550 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25570 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
25580 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
25590 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
255a0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
255b0 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
255c0 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
255d0 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
255e0 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25610 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
25620 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
25630 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
25640 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
25650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25660 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25670 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25680 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25690 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
256a0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
256b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
256c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
256d0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
256e0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
256f0 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
25700 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
25710 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
25720 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
25730 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
25740 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
25750 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
25760 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25770 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
25780 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
25790 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
257a0 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
257b0 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
257c0 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
257d0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73  ayload );..  ass
257e0 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20  ert( aPayload > 
257f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
25800 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61    if( (uptr)(aPa
25810 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61  yload - pPage->a
25820 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73  Data) > (pBt->us
25830 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d  ableSize - pCur-
25840 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b  >info.nLocal) ){
25850 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
25860 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
25870 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
25880 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
25890 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a  rror.  The.    *
258a0 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  * conditional ab
258b0 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20  ove is really:. 
258c0 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f     **    &aPaylo
258d0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
258e0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
258f0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
25900 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75  eSize].    ** bu
25910 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f  t is recast into
25920 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72   its current for
25930 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67  m to avoid integ
25940 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62  er overflow prob
25950 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lems.    */.    
25960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
25970 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
25980 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
25990 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
259a0 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
259b0 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
259c0 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
259d0 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
259e0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
259f0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
25a00 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
25a10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25a20 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
25a30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25a40 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
25a50 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
25a60 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
25a70 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
25a80 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70   (eOp & 0x01), p
25a90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
25aa0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
25ab0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
25ac0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
25ad0 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
25ae0 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
25af0 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69  Local;.  }...  i
25b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25b10 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
25b20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
25b30 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
25b40 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
25b50 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
25b60 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
25b70 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
25b80 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
25b90 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
25ba0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
25bb0 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
25bc0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
25bd0 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
25be0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
25bf0 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
25c00 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
25c10 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
25c20 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
25c30 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
25c40 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
25c50 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25c60 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
25c70 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
25c80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
25c90 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
25ca0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
25cb0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25cc0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
25cd0 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
25ce0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
25cf0 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
25d00 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
25d10 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
25d20 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
25d30 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
25d40 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
25d50 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
25d60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
25d70 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
25d80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25d90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
25da0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
25db0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
25dc0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
25dd0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
25de0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
25df0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
25e00 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
25e10 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
25e20 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
25e30 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  *)sqlite3Realloc
25e40 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  (.            pC
25e50 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e  ur->aOverflow, n
25e60 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67  Ovfl*2*sizeof(Pg
25e70 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
25e80 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d         if( aNew=
25e90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25eb0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
25ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25ed0 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f   pCur->nOvflAllo
25ee0 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20  c = nOvfl*2;.   
25ef0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
25f00 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
25f10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25f20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25f30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25f40 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d      memset(pCur-
25f50 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e  >aOverflow, 0, n
25f60 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  Ovfl*sizeof(Pgno
25f70 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  ));.        pCur
25f80 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
25f90 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
25fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25fb0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
25fc0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
25fd0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
25fe0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
25ff0 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
26000 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
26010 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
26020 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
26030 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
26040 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
26050 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
26060 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
26070 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20  idOvfl)!=0.     
26080 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
26090 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
260a0 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze].    ){.     
260b0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
260c0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
260d0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
260e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
260f0 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
26100 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
26110 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ze);.    }..    
26120 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54  for( ; rc==SQLIT
26130 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26  E_OK && amt>0 &&
26140 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b   nextPage; iIdx+
26150 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  +){..      /* If
26160 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
26170 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
26180 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26190 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
261a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
261b0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
261c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
261d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76  ssert( pCur->aOv
261e0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a  erflow[iIdx]==0.
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
26210 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
26220 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
26230 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
26240 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   );.        pCur
26250 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26260 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
26270 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
26280 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
26290 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
262a0 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
262b0 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
262c0 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
262d0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
262e0 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
262f0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
26300 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
26310 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
26320 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
26330 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
26340 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
26350 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
26360 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
26370 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
26380 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
26390 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
263a0 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
263b0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
263c0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
263d0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
263e0 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  t the aOverflow[
263f0 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20  ] array must be 
26400 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73  allocated becaus
26410 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20  e eOp!=2.       
26420 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f   ** here.  If eO
26430 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65  p==2, then offse
26440 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72  t==0 and this br
26450 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61  anch is never ta
26460 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ken..        */.
26470 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26480 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20  eOp!=2 );.      
26490 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
264a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
264b0 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20  ValidOvfl );.   
264c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
264d0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  r->pBtree->db==p
264e0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20  Bt->db );.      
264f0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
26500 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b  rflow[iIdx+1] ){
26510 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
26520 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
26530 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20  rflow[iIdx+1];. 
26540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
26550 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
26560 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
26570 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
26580 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
26590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66     }.        off
265a0 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b  set -= ovflSize;
265b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
265c0 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f        /* Need to
265d0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
265e0 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e  properly. It con
265f0 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68  tains some of th
26600 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e  e.        ** ran
26610 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ge of data that 
26620 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65  is being read (e
26630 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65  Op==0) or writte
26640 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20  n (eOp!=0)..    
26650 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
26660 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
26670 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
26680 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
26690 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  fd;.#endif.     
266a0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
266b0 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20          if( a + 
266c0 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a  offset > ovflSiz
266d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
266e0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
266f0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  fset;.        }.
26700 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26710 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
26720 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  EAD.        /* I
26730 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  f all the follow
26740 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20  ing are true:.  
26750 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26760 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73   **   1) this is
26770 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
26780 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20  n, and .        
26790 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20  **   2) data is 
267a0 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68  required from th
267b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
267c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61  overflow page, a
267d0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
267e0 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  3) the database 
267f0 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
26800 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26810 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   4) there is no 
26820 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
26830 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
26840 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
26850 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
26860 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a  a WAL database,.
26870 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20          **   6) 
26880 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
26890 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
268a0 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  read..        **
268b0 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34     7) at least 4
268c0 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65   bytes have alre
268d0 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e  ady been read in
268e0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
268f0 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ffer .        **
26900 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
26910 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
26920 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
26930 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26940 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
26950 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
26960 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
26970 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
26980 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
26990 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
269a0 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
269b0 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
269c0 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
269d0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
269e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
269f0 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20  (eOp&0x01)==0   
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
26a30 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
26a40 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26a70 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
26a80 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76  & (bEnd || a==ov
26a90 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20  flSize)         
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ab0 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20       /* (6) */. 
26ac0 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
26ad0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
26ae0 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b00 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
26b10 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
26b20 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
26b30 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
26b40 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
26b50 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
26b60 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
26b70 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
26ba0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
26bb0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20           /* (7) 
26be0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
26bf0 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
26c00 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
26c10 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
26c20 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
26c30 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e   assert( aWrite>
26c40 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20  =pBufStart );   
26c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c60 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28        /* hence (
26c70 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  7) */.          
26c80 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
26c90 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
26ca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26cb0 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
26cc0 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
26cd0 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
26ce0 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
26cf0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
26d00 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
26d10 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26d20 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
26d30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
26d40 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
26d50 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
26d60 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
26d70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
26d80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
26d90 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
26da0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
26dc0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50  eOp&0x01)==0 ? P
26dd0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
26de0 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20  Y : 0).         
26df0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
26e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
26e20 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65  Payload = sqlite
26e30 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
26e40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26e50 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
26e60 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64  et4byte(aPayload
26e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
26e80 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
26e90 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
26ea0 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  +4], pBuf, a, (e
26eb0 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67  Op&0x01), pDbPag
26ec0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26ed0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26ee0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
26ef0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
26f00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
26f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
26f30 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
26f40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
26f50 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
26f60 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
26f70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26f80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26f90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26fa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
26fb0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
26fc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
26fd0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
26fe0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
26ff0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
27000 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
27010 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
27020 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
27030 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
27040 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
27050 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
27060 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
27070 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a  o a valid row.**
27080 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
27090 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
270a0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
270b0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
270c0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
270d0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
270e0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
270f0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
27100 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
27110 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
27120 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
27130 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
27140 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
27150 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
27160 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
27170 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
27180 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27190 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
271a0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
271b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
271c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
271d0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
271e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
271f0 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
27200 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
27210 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
27220 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27230 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
27240 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
27250 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
27260 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
27270 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
27280 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   0);.}../*.** Re
27290 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
272a0 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
272b0 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
272c0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
272d0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
272e0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
272f0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
27300 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
27310 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
27320 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
27330 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
27340 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
27350 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
27360 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
27370 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
27380 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
27390 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
273a0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
273b0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
273c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
273d0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
273e0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
273f0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
27400 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
27410 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27420 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
27430 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
27440 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27450 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27460 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
27470 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
27480 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27490 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
274a0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
274b0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
274c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
274d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
274e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
274f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27500 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27510 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27520 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27530 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
27540 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27550 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27560 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27570 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27580 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
27590 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
275a0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
275b0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
275c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
275d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
275e0 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
275f0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
27600 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
27610 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
27620 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
27630 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
27640 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
27650 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
27660 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
27670 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27680 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
27690 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
276a0 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
276b0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
276c0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
276d0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
276e0 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
276f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
27700 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
27710 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
27720 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
27730 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
27740 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
27750 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27760 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
27770 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
27780 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
27790 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
277a0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
277b0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
277c0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
277d0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
277e0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
277f0 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
27800 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
27810 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
27820 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
27830 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
27840 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
27850 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
27860 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
27870 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
27880 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
27890 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
278a0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
278b0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
278c0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
278d0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
278e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
278f0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
27900 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
27910 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
27920 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
27930 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
27940 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
27950 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
27960 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
27970 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
27980 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
27990 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
279a0 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
279b0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
279c0 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
279d0 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
279e0 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
279f0 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
27a00 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
27a10 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
27a20 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
27a30 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
27a40 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73    u32 amt;.  ass
27a50 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20  ert( pCur!=0 && 
27a60 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
27a70 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
27a80 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
27a90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27aa0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27ab0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27ac0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27ad0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
27ae0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
27af0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
27b00 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
27b10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27b20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27b30 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27b40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27b50 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  ]->nCell );.  as
27b60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27b70 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
27b80 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27b90 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
27ba0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27bb0 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f  ge]->aData || CO
27bc0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73  RRUPT_DB );.  as
27bd0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
27be0 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e  .pPayload<pCur->
27bf0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27c00 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c  ge]->aDataEnd ||
27c10 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61  CORRUPT_DB);.  a
27c20 6d 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d  mt = (int)(pCur-
27c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27c40 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d  age]->aDataEnd -
27c50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27c60 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75  load);.  if( pCu
27c70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61  r->info.nLocal<a
27c80 6d 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d  mt ) amt = pCur-
27c90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
27ca0 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72  *pAmt = amt;.  r
27cb0 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
27cc0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27cd0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
27ce0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
27cf0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
27d00 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
27d10 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
27d20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
27d30 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
27d40 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
27d50 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
27d60 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
27d70 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27d80 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
27d90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
27da0 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
27db0 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
27dc0 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
27dd0 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
27de0 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
27df0 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
27e00 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
27e10 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
27e20 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
27e30 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
27e40 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
27e50 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
27e60 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
27e70 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
27e80 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
27e90 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
27ea0 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
27eb0 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
27ec0 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
27ed0 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
27ee0 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
27ef0 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
27f00 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
27f10 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
27f20 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
27f30 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
27f40 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
27f50 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
27f60 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
27f70 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
27f80 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
27f90 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
27fa0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27fb0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
27fc0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
27fd0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
27fe0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
27ff0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
28000 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
28010 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
28020 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
28030 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28040 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
28050 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28060 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28070 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28080 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28090 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
280a0 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
280b0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
280c0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
280d0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
280e0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
280f0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
28100 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
28110 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
28120 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
28130 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
28140 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
28150 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
28160 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28170 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
28180 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
28190 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
281a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
281b0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
281c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
281d0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
281e0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
281f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28200 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
28210 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
28220 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28230 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
28240 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
28250 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
28260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28270 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28280 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
28290 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
282a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
282b0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
282c0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
282d0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
282e0 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  +;.  pCur->aiIdx
282f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
28300 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  0;.  return getA
28310 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
28320 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
28330 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28340 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75               pCu
28360 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
28370 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20  rFlags);.}..#if 
28380 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28390 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
283a0 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
283b0 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
283c0 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
283d0 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
283e0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
283f0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
28400 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
28410 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
28420 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
28430 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
28440 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
28450 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
28460 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
28470 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
28480 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
28490 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
284a0 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
284b0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
284c0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
284d0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
284e0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
284f0 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f  Child){.  if( CO
28500 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
28510 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69  n;  /* The condi
28520 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c  tions tested bel
28530 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ow might not be 
28540 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  true.           
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
28570 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61   database */.  a
28580 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
28590 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
285a0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
285b0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
285c0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
285d0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
285e0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
285f0 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
28600 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
28610 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
28620 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
28630 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
28640 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
28650 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
28660 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
28670 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
28680 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
28690 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
286a0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
286b0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
286c0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
286d0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
286e0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
286f0 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
28700 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
28710 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
28720 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
28730 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
28740 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
28750 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
28760 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
28770 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
28780 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
28790 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
287a0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
287b0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
287c0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
287d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
287e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
287f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28800 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28810 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
28820 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28830 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28840 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
28850 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
28860 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28870 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28880 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28890 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
288a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
288b0 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
288c0 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28    );.  testcase(
288d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
288e0 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43  r->iPage-1] > pC
288f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28900 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c  >iPage-1]->nCell
28910 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
28920 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
28930 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
28940 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
28950 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
28960 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
28970 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
28980 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28990 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
289a0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
289b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
289c0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
289d0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
289e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
289f0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
28a00 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
28a10 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
28a20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
28a30 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
28a40 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
28a50 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
28a60 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
28a70 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
28a80 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
28a90 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
28aa0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
28ab0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
28ac0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
28ad0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
28ae0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
28af0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
28b00 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
28b10 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
28b20 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
28b30 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
28b40 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
28b50 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
28b60 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
28b70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
28b80 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
28b90 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
28ba0 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
28bb0 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
28bc0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
28bd0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
28be0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
28bf0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
28c00 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
28c10 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
28c20 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
28c30 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
28c40 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
28c50 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
28c60 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
28c70 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
28c80 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
28c90 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
28ca0 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
28cb0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
28cc0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
28cd0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
28ce0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
28cf0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
28d00 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
28d10 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
28d20 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
28d30 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
28d40 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
28d50 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
28d60 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
28d70 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28d80 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
28d90 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
28da0 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
28db0 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
28dc0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
28dd0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
28de0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
28df0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
28e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
28e10 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28e20 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28e40 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
28e50 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
28e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28e70 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
28e80 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28e90 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28ea0 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
28eb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28ec0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
28ed0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
28ee0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
28ef0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
28f00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
28f10 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
28f20 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
28f30 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
28f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
28f50 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
28f60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
28f70 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
28f80 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
28f90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
28fa0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
28fb0 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20  Cur->iPage ){.  
28fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28fd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28fe0 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20  Page]!=0 );.    
28ff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
29000 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
29010 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d  e[pCur->iPage--]
29020 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
29030 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
29040 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
29050 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29060 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
29070 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29080 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
29090 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
290a0 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20  age==(-1) );.   
290b0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
290c0 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65  Page(pCur->pBtre
290d0 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  e->pBt, pCur->pg
290e0 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
290f0 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20  pPage[0],.      
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61    0, pCur->curPa
29120 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69  gerFlags);.    i
29130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29140 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
29150 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29160 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
29170 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
29180 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
29190 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
291a0 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d  urIntKey = pCur-
291b0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
291c0 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  ey;.  }.  pRoot 
291d0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
291e0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  ];.  assert( pRo
291f0 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
29200 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
29210 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
29220 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
29230 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
29240 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
29250 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
29260 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
29270 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
29280 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
29290 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
292a0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
292b0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
292c0 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
292d0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
292e0 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
292f0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
29300 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
29310 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
29320 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
29330 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
29340 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
29350 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
29360 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
29370 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
29380 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
29390 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
293a0 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
293b0 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
293c0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
293d0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
293e0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
293f0 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
29400 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
29410 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
29420 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
29430 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
29440 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
29450 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
29460 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
29470 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
29480 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
29490 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
294a0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
294b0 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
294c0 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
294d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
294e0 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75  BKPT;.  }..  pCu
294f0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
29500 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
29510 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
29520 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
29530 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
29540 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
29550 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66  alidOvfl);..  if
29560 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
29570 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29580 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29590 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
295a0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
295b0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
295c0 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
295d0 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
295e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
295f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
29600 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
29610 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
29620 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
29630 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
29640 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
29650 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
29660 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
29670 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
29680 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
29690 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
296a0 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
296b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
296c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
296d0 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
296e0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
296f0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
29700 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
29710 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29720 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
29730 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29740 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
29750 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
29760 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
29770 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
29780 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
29790 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
297a0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
297b0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
297c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
297d0 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
297e0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
297f0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29800 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29810 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29820 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29830 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29850 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29860 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29870 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29880 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29890 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
298a0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
298b0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
298c0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
298d0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
298e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
298f0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
29900 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29910 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
29920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29930 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29940 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
29950 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29960 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29970 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29980 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29990 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
299a0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
299b0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
299c0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
299d0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
299e0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
299f0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29a00 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29a10 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29a20 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29a30 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29a40 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29a50 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
29a60 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
29a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29a80 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29a90 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29aa0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29ab0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29ac0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29ad0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29ae0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29af0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29b00 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29b10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29b20 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29b30 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29b40 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29b50 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29b70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29b80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29b90 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
29ba0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29bb0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
29bc0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
29bd0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29be0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29bf0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
29c00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29c10 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29c20 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
29c30 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29c40 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
29c50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29c60 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
29c70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29c80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
29c90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ca0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
29cb0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
29cc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
29cd0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
29ce0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29cf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
29d00 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29d10 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
29d20 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
29d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
29d40 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
29d50 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
29d60 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
29d70 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
29d80 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
29d90 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
29da0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
29db0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
29dc0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
29dd0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29de0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29df0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
29e00 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29e10 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29e20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29e30 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29e40 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29e50 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
29e60 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
29e70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29e80 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
29e90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29ea0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
29eb0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29ec0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
29ed0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29ee0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29ef0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
29f00 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
29f10 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
29f20 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
29f30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29f40 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
29f50 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
29f60 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
29f70 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
29f80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29f90 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
29fa0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
29fb0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
29fc0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
29fd0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
29fe0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
29ff0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2a000 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2a010 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2a020 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2a030 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2a040 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2a050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2a060 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2a070 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2a080 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2a090 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a0a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a0b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2a0c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a0d0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a0e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2a0f0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2a100 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2a110 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a120 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2a130 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2a140 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2a150 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2a160 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a170 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2a180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2a190 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2a1a0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2a1b0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2a1c0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2a1d0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2a1e0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2a1f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2a200 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2a210 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2a220 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2a230 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2a240 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2a250 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2a260 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2a270 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2a280 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a290 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
2a2a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a2b0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2a2c0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2a2d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a2e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2a2f0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2a300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a310 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2a320 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a340 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2a350 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2a360 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2a370 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a380 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a390 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a3a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a3b0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a3c0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a3d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a3e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2a3f0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2a400 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a410 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2a420 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2a430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a450 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2a460 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2a470 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2a480 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2a490 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2a4a0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a4b0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2a4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a4d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a4e0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2a4f0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2a500 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2a510 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2a520 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2a530 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2a540 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2a550 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2a560 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2a570 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2a580 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2a590 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2a5a0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2a5b0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2a5c0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2a5d0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2a5e0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2a5f0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2a600 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2a610 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2a620 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2a630 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2a640 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2a650 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2a660 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2a670 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2a680 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2a690 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2a6a0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2a6b0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2a6c0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2a6d0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2a6e0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2a6f0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2a700 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2a710 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2a720 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2a730 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2a740 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2a750 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2a760 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2a770 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2a780 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2a790 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2a7a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a7b0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a7c0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a7d0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2a7e0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2a7f0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2a800 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2a810 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a820 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2a830 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2a840 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2a850 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2a860 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2a870 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a880 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a890 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2a8b0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2a8c0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a8d0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2a8e0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a8f0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a900 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2a910 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2a920 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2a930 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2a940 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2a950 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2a960 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2a970 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2a980 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2a990 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2a9a0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2a9b0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2a9c0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2a9d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2a9e0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2a9f0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2aa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2aa10 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2aa20 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2aa30 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2aa40 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2aa50 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2aa60 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2aa70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2aa80 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2aa90 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2aaa0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2aab0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2aac0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2aad0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aaf0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2ab00 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2ab10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2ab20 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2ab30 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2ab40 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ab50 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ab60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ab70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ab80 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2ab90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2aba0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2abb0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2abc0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2abd0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
2abe0 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2abf0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2ac00 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2ac10 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2ac20 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2ac30 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2ac40 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2ac50 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2ac60 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ac70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
2ac80 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  & (pCur->curFlag
2ac90 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2aca0 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75  ey)!=0.   && pCu
2acb0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20 20  r->curIntKey .  
2acc0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2acd0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2ace0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2acf0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2ad00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ad10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43     }.    if( (pC
2ad20 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2ad30 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26  TCF_AtLast)!=0 &
2ad40 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
2ad50 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2ad60 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2ad70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ad80 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2ad90 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
2ada0 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
2adb0 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
2adc0 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
2add0 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
2ade0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  Key->errCode = 0
2adf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
2ae00 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2ae10 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
2ae20 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
2ae30 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
2ae40 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
2ae50 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
2ae60 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
2ae70 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
2ae80 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
2ae90 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
2aea0 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
2aeb0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2aec0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2aed0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2aee0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2aef0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2af00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2af10 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
2af20 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2af30 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2af40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2af50 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
2af60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2af70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
2af80 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61  VALID || pCur->a
2af90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2afa0 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
2afb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2afc0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
2afd0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
2afe0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
2aff0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b000 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2b010 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2b020 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2b030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b040 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
2b050 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2b060 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e  ->intKey==pCur->
2b070 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61  curIntKey );.  a
2b080 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
2b090 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  IntKey || pIdxKe
2b0a0 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
2b0b0 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
2b0c0 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
2b0d0 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
2b0e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2b0f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b100 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
2b110 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2b140 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
2b150 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
2b160 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
2b170 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
2b180 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
2b190 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
2b1a0 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
2b1b0 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
2b1c0 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
2b1d0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
2b1e0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
2b1f0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
2b200 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2b210 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
2b220 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
2b230 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
2b240 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2b250 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
2b260 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
2b270 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
2b280 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
2b290 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
2b2a0 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
2b2b0 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
2b2c0 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
2b2d0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
2b2e0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
2b2f0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
2b300 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
2b310 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2b320 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2b330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b340 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
2b350 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
2b360 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
2b370 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2b380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
2b390 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
2b3a0 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
2b3b0 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
2b3c0 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
2b3d0 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
2b3e0 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
2b3f0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
2b400 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b410 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2b420 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
2b430 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
2b440 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2b450 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
2b460 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2b470 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2b480 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  r(pPage, idx);. 
2b490 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2b4a0 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
2b4b0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2b4c0 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
2b4d0 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2b4e0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
2b4f0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
2b500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2b510 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b530 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
2b540 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
2b550 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
2b560 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
2b570 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2b580 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2b590 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2b5a0 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2b5b0 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
2b5c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
2b5d0 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
2b5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2b5f0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2b600 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2b610 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
2b620 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b630 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2b640 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
2b650 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
2b660 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2b670 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
2b680 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2b690 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2b6a0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2b6b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b6c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b6d0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2b6e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2b6f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b700 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
2b710 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b720 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2b730 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2b740 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
2b750 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2b760 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b770 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2b780 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2b790 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2b7a0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b7b0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2b7c0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2b7d0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2b7e0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2b7f0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2b800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b810 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2b820 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2b830 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2b840 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2b850 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2b860 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b870 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2b880 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2b890 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2b8a0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2b8b0 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2b8c0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2b8d0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2b8e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2b8f0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2b900 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2b910 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2b920 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2b930 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2b940 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2b950 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2b960 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2b970 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2b980 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2b990 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2b9a0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2b9b0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2b9c0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2b9d0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2b9e0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2b9f0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2ba00 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2ba10 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2ba20 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2ba30 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2ba40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2ba50 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2ba60 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2ba70 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2ba80 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2ba90 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2baa0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2bab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2bac0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2bad0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2bae0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2baf0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2bb00 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2bb10 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2bb20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2bb30 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2bb40 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2bb50 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2bb60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bb70 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2bb80 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2bb90 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2bba0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2bbb0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2bbc0 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2bbd0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2bbe0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2bbf0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2bc00 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2bc10 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2bc20 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2bc30 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2bc40 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2bc50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bc60 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2bc70 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2bc80 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2bc90 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2bca0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2bcb0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2bcc0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bcd0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bce0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2bcf0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bd00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2bd10 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2bd20 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2bd30 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2bd40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2bd50 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2bd60 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2bd70 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2bd80 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2bd90 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2bda0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2bdb0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2bdc0 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2bdd0 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2bde0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2bdf0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2be00 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2be10 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2be20 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2be30 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2be40 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2be50 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2be60 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2be70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2be80 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2be90 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2bea0 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2beb0 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2bec0 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2bed0 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2bee0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2bef0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2bf00 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2bf10 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2bf20 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2bf30 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2bf40 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2bf50 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2bf60 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2bf70 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2bf80 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2bf90 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2bfa0 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2bfb0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2bfc0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2bfd0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2bfe0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2bff0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2c000 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2c010 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2c020 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2c030 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2c040 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2c050 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2c060 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2c070 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2c080 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c090 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2c0a0 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2c0b0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2c0c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c0d0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2c0e0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2c0f0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2c100 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2c110 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c120 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2c130 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2c140 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2c150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2c160 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2c170 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c180 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2c190 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c1a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c1b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1c0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2c1d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2c1e0 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2c1f0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2c200 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2c210 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c220 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2c230 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c240 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c260 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c270 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c280 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c290 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2c2a0 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2c2b0 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2c2c0 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
2c2d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c2e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2c2f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2c300 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2c310 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c320 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2c330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c340 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2c350 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2c360 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2c370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c380 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2c390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3a0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2c3b0 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2c3c0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2c3d0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2c3e0 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2c3f0 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2c400 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2c410 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2c420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2c430 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c440 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2c450 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2c460 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2c470 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2c480 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2c490 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2c4a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2c4b0 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2c4c0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2c4d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2c4e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c4f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2c500 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c510 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c520 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2c530 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2c540 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2c550 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2c560 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c580 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2c590 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2c5a0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2c5b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2c5c0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2c5d0 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2c5e0 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
2c5f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
2c600 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
2c610 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
2c620 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2c630 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
2c640 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2c650 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2c660 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2c670 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
2c680 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c690 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
2c6a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2c6b0 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2c6c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c6d0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2c6e0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2c6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2c700 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2c710 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c720 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2c730 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2c740 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2c750 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2c760 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2c770 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2c780 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2c790 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c7a0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2c7b0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2c7c0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2c7d0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
2c7e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c7f0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2c800 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2c810 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2c820 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2c830 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2c840 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2c850 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2c860 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2c870 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2c880 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2c890 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fl);.  return rc
2c8a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
2c8b0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
2c8c0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
2c8d0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2c8e0 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
2c8f0 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
2c900 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
2c910 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
2c920 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
2c930 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
2c940 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2c950 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
2c960 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
2c970 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
2c980 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
2c990 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
2c9a0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
2c9b0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2c9c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
2c9d0 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
2c9e0 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
2c9f0 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
2ca00 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
2ca10 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
2ca20 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
2ca30 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2ca40 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
2ca50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
2ca60 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
2ca70 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
2ca80 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
2ca90 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
2caa0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
2cab0 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
2cac0 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
2cad0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
2cae0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2caf0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2cb00 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2cb10 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2cb20 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2cb30 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2cb40 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2cb50 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2cb60 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2cb70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2cb80 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
2cb90 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
2cba0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
2cbb0 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
2cbc0 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2cbd0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
2cbe0 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
2cbf0 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2cc00 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2cc10 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2cc20 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
2cc30 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2cc40 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2cc50 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
2cc60 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2cc70 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2cc80 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
2cc90 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
2cca0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
2ccb0 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
2ccc0 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
2ccd0 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
2cce0 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
2ccf0 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
2cd00 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
2cd10 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
2cd20 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
2cd30 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
2cd40 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
2cd50 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
2cd60 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
2cd70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
2cd80 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
2cd90 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
2cda0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
2cdb0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
2cdc0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
2cdd0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
2cde0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
2cdf0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
2ce00 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
2ce10 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
2ce20 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
2ce30 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
2ce40 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ce50 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
2ce60 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
2ce70 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
2ce80 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
2ce90 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
2cea0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
2ceb0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
2cec0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ced0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
2cee0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
2cef0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
2cf00 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
2cf10 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
2cf20 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
2cf30 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2cf40 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
2cf50 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2cf60 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2cf70 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2cf80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2cf90 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2cfa0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2cfb0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2cfc0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2cfd0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2cfe0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cff0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
2d000 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
2d010 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d020 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2d030 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2d040 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2d050 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2d060 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2d070 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2d080 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2d090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d0a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2d0b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2d0c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2d0d0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2d0e0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2d0f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2d100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d110 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2d120 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2d130 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2d140 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2d150 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2d160 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2d170 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2d180 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d190 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2d1a0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2d1b0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2d1c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2d1d0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2d1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2d200 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2d210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2d220 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d230 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2d240 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2d250 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d260 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2d270 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2d280 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2d290 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2d2a0 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2d2b0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2d2c0 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2d2d0 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2d2e0 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2d2f0 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2d300 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2d310 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2d320 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2d330 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2d340 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2d350 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2d360 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2d370 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2d380 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2d390 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2d3a0 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2d3b0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2d3c0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2d3d0 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2d3e0 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2d3f0 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2d400 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2d410 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2d420 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2d430 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2d440 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2d450 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2d460 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2d470 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2d480 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d490 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2d4a0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2d4b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2d4c0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2d4d0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2d4e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2d4f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2d500 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2d510 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2d520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2d540 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2d550 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2d560 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d570 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2d580 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
2d590 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d5a0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2d5b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2d5c0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2d5d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2d5e0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2d5f0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2d600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d610 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d620 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2d630 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2d640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d650 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d660 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d670 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2d680 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2d690 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2d6a0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2d6b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d6c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d6d0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2d6e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2d6f0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2d700 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2d710 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2d720 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2d730 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2d740 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d750 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
2d760 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2d770 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2d780 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
2d790 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2d7a0 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73  idOvfl);.  *pRes
2d7b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
2d7c0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d7d0 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20  _VALID ) return 
2d7e0 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2d7f0 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d  pRes);.  pPage =
2d800 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d810 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
2d820 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78  ( (++pCur->aiIdx
2d830 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d  [pCur->iPage])>=
2d840 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d850 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2d860 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2d870 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2d880 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2d890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
2d8a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2d8b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d8c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2d8d0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2d8e0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2d8f0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
2d900 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
2d910 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
2d920 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
2d930 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2d940 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2d950 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2d960 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2d970 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2d980 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
2d990 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2d9a0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2d9b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2d9c0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2d9d0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2d9e0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2d9f0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2da00 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2da10 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2da20 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2da30 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2da40 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2da50 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  decrementing the
2da60 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2da70 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2da80 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2da90 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2daa0 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2dab0 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65  slower) btreePre
2dac0 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65  vious().** helpe
2dad0 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  r routine is cal
2dae0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2daf0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2db00 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2db10 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65  page.** or to re
2db20 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2db30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2db40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2db50 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2db60 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2db70 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2db80 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2db90 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2dba0 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2dbb0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2dbc0 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2dbd0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2dbe0 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2dbf0 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2dc00 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2dc10 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2dc20 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2dc30 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2dc40 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2dc50 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2dc60 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2dc70 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2dc80 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2dc90 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2dca0 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2dcb0 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2dcc0 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2dcd0 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2dce0 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2dcf0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2dd00 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2dd10 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2dd20 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2dd30 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2dd40 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2dd50 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2dd60 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2dd70 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72  LINE int btreePr
2dd80 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2dd90 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2dda0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2ddb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2ddc0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2ddd0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2dde0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2ddf0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2de00 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2de10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2de20 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2de30 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2de40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2de50 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2de60 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2de70 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2de80 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2de90 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61  NKey))==0 );.  a
2dea0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2deb0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2dec0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ded0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2dee0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  {.    rc = resto
2def0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2df00 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2df10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2df20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2df30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2df40 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2df50 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2df60 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2df70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2df80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2df90 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2dfa0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2dfb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2dfc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2dfd0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2dfe0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2dff0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2e000 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2e010 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2e020 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2e030 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
2e040 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2e050 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2e060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2e070 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2e080 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2e090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2e0a0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2e0b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2e0c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e0d0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2e0e0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e0f0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
2e100 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e110 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
2e120 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2e130 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
2e140 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
2e150 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
2e160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e170 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2e180 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
2e190 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2e1a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2e1b0 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
2e1c0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2e1d0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2e1e0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e1f0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2e200 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
2e210 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2e220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2e240 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2e250 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e260 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2e270 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
2e280 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2e290 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
2e2a0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2e2b0 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
2e2c0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2e2d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2e2e0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2e2f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2e300 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
2e310 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2e320 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e340 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2e350 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2e360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2e370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e380 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e390 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
2e3a0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2e3b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2e3c0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73  int *pRes){.  as
2e3d0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2e3e0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2e3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2e400 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2e410 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2e420 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2e430 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2e440 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2e450 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e460 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
2e470 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2e480 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2e490 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2e4a0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2e4b0 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
2e4c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
2e4d0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2e4e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
2e4f0 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
2e500 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
2e510 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
2e520 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2e530 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
2e540 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
2e550 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2e560 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
2e570 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e580 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
2e590 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2e5a0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
2e5b0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
2e5c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2e5d0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
2e5e0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
2e5f0 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2e600 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2e610 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2e620 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2e630 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2e640 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2e650 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2e660 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2e670 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2e680 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2e690 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2e6a0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2e6b0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2e6c0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2e6d0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2e6e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2e6f0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2e700 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2e710 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2e720 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2e730 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
2e740 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
2e750 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
2e760 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
2e770 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2e780 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2e790 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2e7a0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2e7b0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2e7c0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2e7d0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2e7e0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2e7f0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2e800 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2e810 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2e820 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2e830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e840 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2e850 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2e860 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2e870 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2e880 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2e890 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2e8a0 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2e8b0 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2e8c0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2e8d0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2e8e0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2e8f0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2e900 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2e910 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2e920 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2e930 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2e940 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2e950 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2e960 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2e970 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2e980 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2e990 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2e9a0 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2e9b0 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2e9c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2e9d0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2e9e0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2e9f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2ea00 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2ea10 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2ea20 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2ea30 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2ea40 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2ea50 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2ea60 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2ea70 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2ea80 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2ea90 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2eaa0 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2eab0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2eac0 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2ead0 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eaf0 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2eb00 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2eb10 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2eb20 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2eb30 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2eb40 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2eb50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2eb60 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2eb70 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2eb80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2eb90 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2eba0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2ebb0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2ebc0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2ebd0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2ebe0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2ebf0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2ec00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2ec10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2ec20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ec30 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2ec40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2ec50 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2ec60 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2ec70 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2ec80 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2ec90 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2eca0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2ecb0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2ecc0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2ecd0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2ece0 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2ecf0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2ed00 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2ed10 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2ed20 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2ed30 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2ed40 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2ed50 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2ed60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ed70 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2ed80 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2ed90 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2eda0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2edb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2edc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2edd0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2ede0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2edf0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2ee00 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2ee10 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2ee20 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2ee30 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2ee40 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2ee50 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2ee60 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2ee70 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2ee80 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72  */.    u32 nSear
2ee90 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75  ch = 0;   /* Cou
2eea0 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
2eeb0 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d   of search attem
2eec0 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  pts */.    .    
2eed0 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
2eee0 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
2eef0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
2ef00 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
2ef10 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
2ef20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2ef30 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
2ef40 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2ef50 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
2ef60 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
2ef70 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2ef80 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
2ef90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2efa0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2efb0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2efc0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
2efd0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
2efe0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
2eff0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2f000 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
2f010 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
2f020 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
2f030 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
2f040 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
2f050 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
2f060 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
2f070 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f080 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2f090 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
2f0a0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2f0b0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2f0c0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
2f0d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
2f0e0 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
2f0f0 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2f100 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2f110 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2f120 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
2f130 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
2f140 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
2f150 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
2f160 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
2f170 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
2f180 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
2f190 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
2f1a0 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
2f1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f1c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2f1d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2f1e0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f1f0 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
2f200 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2f210 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
2f220 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
2f230 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
2f240 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
2f250 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
2f260 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
2f270 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
2f280 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
2f290 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
2f2a0 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
2f2b0 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
2f2c0 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
2f2d0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
2f2e0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2f2f0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
2f300 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
2f310 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
2f320 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2f330 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2f340 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
2f350 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
2f360 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
2f370 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
2f380 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2f390 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2f3a0 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
2f3b0 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
2f3c0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
2f3d0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
2f3e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
2f3f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f400 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
2f410 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2f420 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
2f430 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
2f440 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
2f450 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2f460 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2f470 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f480 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2f490 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
2f4a0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
2f4b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
2f4c0 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
2f4d0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2f4e0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2f4f0 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
2f500 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
2f510 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
2f520 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
2f530 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
2f540 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
2f550 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
2f560 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
2f570 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2f580 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f590 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
2f5a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f5b0 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
2f5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
2f5d0 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
2f5e0 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
2f5f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f600 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f610 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f620 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2f630 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2f640 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2f650 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
2f660 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f670 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2f680 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
2f690 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f6a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2f6b0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
2f6c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2f6d0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
2f6e0 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
2f6f0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2f700 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
2f710 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
2f720 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f730 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
2f740 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f750 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
2f760 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
2f770 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
2f780 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2f790 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
2f7a0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
2f7b0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
2f7c0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2f7d0 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
2f7e0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
2f7f0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
2f800 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
2f810 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
2f820 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
2f830 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
2f840 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
2f850 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
2f860 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
2f870 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
2f880 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
2f890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f8a0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2f8b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2f8c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f8d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f8e0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f8f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
2f900 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2f910 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2f920 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2f930 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2f940 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2f950 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2f960 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
2f970 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2f980 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f990 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2f9a0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2f9b0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2f9c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2f9d0 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
2f9e0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
2f9f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
2fa00 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
2fa10 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
2fa20 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
2fa30 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
2fa40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2fa50 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
2fa60 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fa70 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
2fa80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2fa90 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
2faa0 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20  f( searchList . 
2fab0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
2fac0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c  earby==iTrunk ||
2fad0 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20   (iTrunk<nearby 
2fae0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2faf0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b  C_LE)) .      ){
2fb00 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2fb10 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
2fb20 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
2fb30 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
2fb40 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
2fb50 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
2fb60 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2fb70 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
2fb80 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2fb90 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2fba0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2fbb0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2fbc0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
2fbd0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2fbe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fbf0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2fc00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2fc10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2fc20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2fc30 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2fc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fc50 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
2fc60 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2fc70 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2fc80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2fc90 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2fca0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fcb0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2fcc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fcd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2fce0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2fcf0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2fd00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2fd10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fd30 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fd40 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fd60 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
2fd70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fd80 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fd90 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2fda0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2fdb0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2fdc0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
2fdd0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
2fde0 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
2fdf0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
2fe00 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
2fe10 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
2fe20 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
2fe30 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
2fe40 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
2fe50 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
2fe60 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
2fe70 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
2fe80 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
2fe90 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
2fea0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
2feb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2fec0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
2fed0 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
2fee0 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
2fef0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ff00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ff20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ff30 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2ff40 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ff50 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
2ff60 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2ff70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ff80 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2ff90 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
2ffa0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2ffb0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ffc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ffd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2ffe0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30000 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30010 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
30020 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30030 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30050 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
30060 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
30070 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
30080 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
30090 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
300a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
300b0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
300c0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
300d0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
300e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
300f0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
30100 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
30110 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30120 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
30130 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
30140 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
30150 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
30160 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
30170 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
30180 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
30190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
301a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
301b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
301c0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
301d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
301e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
301f0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
30200 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
30210 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30220 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30230 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
30240 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
30250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30260 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30270 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30280 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30290 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
302a0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
302b0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
302c0 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
302d0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
302e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
302f0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
30300 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
30310 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
30320 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
30330 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
30340 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
30350 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30360 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
30370 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
30380 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
30390 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
303a0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
303b0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
303c0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
303d0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
303e0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
303f0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
30400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
30410 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
30420 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
30430 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
30440 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
30450 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
30460 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
30470 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
30480 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
30490 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
304a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
304b0 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
304c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304d0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
304e0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
304f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
30500 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30510 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
30520 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
30530 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
30540 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
30550 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
30560 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
30570 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
30580 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
30590 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
305a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
305b0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
305c0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
305d0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
305e0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
305f0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
30600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30610 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
30630 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
30640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30660 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
30670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
30680 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
30690 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
306a0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
306b0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
306c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
306d0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
306e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
306f0 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
30700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
30710 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30720 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
30730 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30740 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30750 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
30760 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
30770 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
30780 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
30790 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
307a0 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
307b0 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
307c0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
307d0 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
307e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
307f0 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
30800 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
30810 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
30820 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30830 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
30840 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30860 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
30870 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
30880 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
30890 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
308a0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
308b0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
308c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
308d0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
308e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
308f0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
30900 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30910 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
30920 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
30930 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
30940 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
30950 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
30960 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
30970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30980 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
30990 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
309a0 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
309b0 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
309c0 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
309d0 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  o)? PAGER_GET_NO
309e0 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
309f0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30a00 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30a10 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
30a20 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
30a30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30a40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30a50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30a60 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30a70 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
30a80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30a90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30ab0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30ac0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
30ad0 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
30ae0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
30af0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30b00 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
30b10 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
30b20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30b30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30b40 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
30b50 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
30b60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
30b70 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
30b80 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
30b90 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
30ba0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
30bb0 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
30bc0 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
30bd0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
30be0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
30bf0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
30c00 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
30c10 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
30c20 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
30c30 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
30c40 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
30c50 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
30c60 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
30c70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
30c80 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
30c90 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
30ca0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
30cb0 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
30cc0 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
30cd0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
30ce0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
30cf0 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
30d00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
30d10 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
30d20 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
30d30 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
30d40 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
30d50 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
30d60 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
30d70 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
30d80 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
30d90 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
30da0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
30db0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
30dc0 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
30dd0 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
30de0 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
30df0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
30e00 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
30e10 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
30e20 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
30e30 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
30e40 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
30e50 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
30e60 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
30e70 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
30e80 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
30e90 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
30ea0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
30eb0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
30ec0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
30ed0 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
30ee0 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
30ef0 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
30f00 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
30f10 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
30f20 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
30f30 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
30f40 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
30f50 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
30f60 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
30f70 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
30f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
30fa0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
30fb0 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
30fc0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
30fd0 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
30fe0 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
30ff0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31000 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
31010 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31020 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31030 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
31040 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
31050 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
31060 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
31070 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
31080 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
31090 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
310a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
310b0 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
310c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
310d0 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
310e0 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
310f0 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
31100 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
31110 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
31120 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
31130 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
31140 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
31150 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
31160 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
31170 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
31180 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
31190 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
311a0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
311b0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
311c0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
311d0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
311e0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
311f0 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
31200 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
31210 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
31220 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
31230 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
31240 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
31250 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
31260 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
31270 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
31280 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
31290 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
312a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
312b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
312c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
312d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
312e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
312f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
31300 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
31310 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
31320 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
31330 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
31340 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
31350 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
31360 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
31370 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
31380 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
31390 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
313a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
313b0 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
313c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
313d0 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
313e0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
313f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31400 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
31410 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31420 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
31430 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
31440 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
31450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31460 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31470 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
31480 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
31490 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
314a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
314b0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
314c0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
314d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
314e0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
314f0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
31500 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
31510 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
31520 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
31530 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31540 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
31550 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
31560 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
31570 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
31580 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73  revTrunk);.  ass
31590 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
315a0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
315b0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
315c0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
315d0 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  e)<=1 );.  asser
315e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
315f0 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
31600 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65  sInit==0 );.  re
31610 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31620 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31630 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
31640 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
31650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
31660 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
31670 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
31680 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
31690 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
316a0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
316b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
316c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
316d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
316e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
316f0 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
31700 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
31710 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
31720 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31730 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
31740 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
31750 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
31760 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
31770 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
31780 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
31790 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
317a0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
317b0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
317c0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
317d0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
317e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
317f0 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
31800 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
31810 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
31820 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
31830 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
31840 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
31850 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
31860 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
31870 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
31880 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
31890 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
318a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
318b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
318c0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
318d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
318e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
318f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
31900 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
31910 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
31920 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
31930 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
31940 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
31950 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31970 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
31980 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
31990 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
319c0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
319d0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
319e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319f0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
31a00 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
31a10 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
31a20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31a30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
31a40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
31a50 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
31a60 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20   || iPage>1 );. 
31a70 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
31a80 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
31a90 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
31aa0 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20    if( iPage<2 ) 
31ab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
31ac0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66  RRUPT_BKPT;.  if
31ad0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
31ae0 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
31af0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
31b00 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
31b10 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
31b20 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
31b30 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
31b40 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
31b50 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
31b60 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
31b70 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
31b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31b90 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
31ba0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
31bb0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
31bc0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
31bd0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31be0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
31bf0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
31c00 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31c10 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
31c20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
31c30 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
31c40 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
31c50 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
31c60 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
31c70 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
31c80 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
31c90 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
31ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
31cb0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
31cc0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
31cd0 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
31ce0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
31cf0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
31d00 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
31d10 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
31d20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31d30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
31d40 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
31d50 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
31d60 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
31d70 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
31d80 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
31d90 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
31da0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
31db0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
31dc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
31dd0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
31de0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
31df0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
31e00 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
31e10 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
31e20 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
31e30 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
31e40 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
31e50 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31e60 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
31e70 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
31e80 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
31e90 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
31ea0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
31eb0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
31ec0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
31ed0 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
31ee0 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
31ef0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
31f00 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
31f10 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
31f20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
31f30 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
31f40 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
31f50 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
31f60 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
31f70 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
31f80 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
31f90 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
31fa0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
31fb0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
31fc0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
31fd0 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
31fe0 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
31ff0 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
32000 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
32010 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
32020 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
32030 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
32040 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
32050 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
32060 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
32070 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
32080 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
32090 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
320a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
320b0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
320c0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
320d0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
320e0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
320f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
32100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32110 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32120 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
32130 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
32140 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
32150 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32160 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
32170 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
32180 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
32190 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
321a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
321b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
321c0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
321d0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
321e0 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
321f0 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
32200 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
32210 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
32220 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
32230 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
32240 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
32250 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
32260 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
32270 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
32280 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
32290 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
322a0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
322b0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
322c0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
322d0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
322e0 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
322f0 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
32300 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
32310 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
32320 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
32330 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
32340 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
32350 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
32360 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
32370 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
32380 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
32390 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
323a0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
323b0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
323c0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
323d0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
323e0 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
323f0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
32400 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
32410 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
32420 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
32430 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
32440 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
32450 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
32460 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
32470 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
32480 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
32490 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
324a0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
324b0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
324c0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
324d0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
324e0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
324f0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
32500 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
32510 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
32520 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
32530 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
32540 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
32550 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
32560 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
32570 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
32580 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
32590 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
325a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
325b0 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
325c0 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
325d0 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
325e0 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
325f0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
32600 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
32610 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
32620 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
32630 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
32640 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
32650 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
32660 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
32670 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
32680 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
32690 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
326a0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
326b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
326c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
326d0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
326e0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
326f0 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
32700 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32710 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32720 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
32730 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
32740 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
32750 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
32760 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
32770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
32780 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
32790 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
327a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
327b0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
327c0 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
327d0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
327e0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
327f0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
32800 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
32810 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
32820 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
32830 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
32840 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
32850 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
32860 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
32870 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
32880 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
32890 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
328a0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
328b0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
328c0 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
328d0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
328e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
328f0 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
32900 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
32910 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
32920 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
32930 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
32940 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
32950 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
32960 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
32970 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
32980 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
32990 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
329a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
329b0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
329c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
329d0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
329e0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
329f0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
32a00 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
32a10 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
32a20 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
32a30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32a40 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32a50 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
32a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
32a70 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
32a80 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
32a90 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
32aa0 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
32ab0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
32ac0 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
32ad0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32ae0 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
32af0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
32b00 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
32b10 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
32b20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
32b30 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
32b40 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
32b50 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
32b60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
32b70 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
32b80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
32b90 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
32ba0 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
32bb0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
32bc0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
32bd0 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
32be0 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
32bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32c00 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
32c10 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
32c20 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
32c30 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
32c40 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
32c50 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
32c60 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
32c70 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20  en Cell.  Write 
32c80 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c  the.** local Cel
32c90 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62  l size (the numb
32ca0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74  er of bytes on t
32cb0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
32cc0 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76  , omitting.** ov
32cd0 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e  erflow) into *pn
32ce0 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
32cf0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
32d00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
32d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32d20 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
32d30 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
32d40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32d50 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
32d60 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
32d70 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70  Cell */.  u16 *p
32d80 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
32d90 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
32da0 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  size of the Cell
32db0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74   here */.){.  Bt
32dc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
32dd0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
32de0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
32df0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
32e00 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
32e10 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
32e20 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
32e30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32e40 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
32e50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
32e60 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
32e70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
32e80 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  fo);.  *pnSize =
32e90 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69   info.nSize;.  i
32ea0 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d  f( info.nLocal==
32eb0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
32ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
32ed0 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
32ee0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
32ef0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
32f00 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
32f10 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69   }.  if( pCell+i
32f20 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20 3e 20 70 50  nfo.nSize-1 > pP
32f30 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
32f40 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
32f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32f60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
32f70 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
32f80 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
32f90 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
32fa0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
32fb0 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  ll + info.nSize 
32fc0 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74 28 20  - 4);.  assert( 
32fd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32fe0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
32ff0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
33000 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
33010 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
33020 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
33030 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
33040 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
33050 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
33060 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
33070 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
33080 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20  info.nPayload + 
33090 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
330a0 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
330b0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
330c0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
330d0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
330e0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
330f0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
33100 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
33110 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
33120 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
33130 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
33140 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
33150 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
33160 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
33170 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
33180 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
33190 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
331a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
331b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
331c0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
331d0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
331e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
331f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
33210 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
33220 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
33230 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
33240 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
33250 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
33260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
33270 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
33280 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
33290 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
332a0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
332b0 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
332c0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
332d0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
332e0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
332f0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
33300 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
33310 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
33320 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
33330 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
33340 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
33350 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
33360 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
33370 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
33380 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
33390 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
333a0 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
333b0 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
333c0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
333d0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
333e0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
333f0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
33400 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
33410 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
33420 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
33430 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
33440 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
33450 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
33460 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
33470 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
33480 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
33490 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
334a0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
334b0 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
334c0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
334d0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
334e0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
334f0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
33500 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
33510 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
33520 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
33530 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
33540 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
33550 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
33560 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
33570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33580 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
33590 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
335a0 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
335b0 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
335c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
335d0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
335e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
335f0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
33600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33610 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33620 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
33630 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
33640 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
33650 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
33660 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
33670 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
33680 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
33690 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
336a0 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
336b0 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
336c0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
336d0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
336e0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
336f0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
33700 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
33710 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
33720 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
33730 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
33740 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
33750 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
33760 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
33770 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
33780 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
33790 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
337a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
337b0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
337c0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
337d0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
337e0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
337f0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
33800 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
33810 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
33820 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
33830 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
33840 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
33850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33860 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
33870 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33890 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
338a0 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
338b0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
338c0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
338d0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
338e0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
338f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
33900 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
33910 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
33920 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
33930 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
33940 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
33950 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33970 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
33980 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
33990 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
339a0 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
339b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
339c0 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
339d0 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
339e0 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
339f0 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
33a00 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
33a10 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
33a20 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
33a30 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
33a40 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
33a50 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
33a60 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
33a70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
33a80 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
33a90 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
33aa0 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
33ab0 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
33ac0 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
33ad0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
33ae0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
33af0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
33b00 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
33b10 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
33b20 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
33b30 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
33b40 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
33b50 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
33b60 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
33b70 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
33b80 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
33b90 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
33ba0 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
33bb0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
33bc0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
33bd0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
33be0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
33bf0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33c00 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
33c10 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
33c20 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50  /.  nHeader = pP
33c30 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
33c40 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  e;.  nPayload = 
33c50 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
33c60 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
33c70 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  eyLeaf ){.    nH
33c80 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
33c90 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61  nt32(&pCell[nHea
33ca0 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  der], nPayload);
33cb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33cc0 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20 29  sert( nData==0 )
33cd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 5a  ;.    assert( nZ
33ce0 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ero==0 );.  }.  
33cf0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33d00 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
33d10 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b  der], *(u64*)&nK
33d20 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ey);.  .  /* Fil
33d30 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
33d40 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70   size */.  if( p
33d50 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
33d60 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
33d70 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
33d80 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
33d90 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
33da0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30   assert( nKey<=0
33db0 78 37 66 66 66 66 66 66 66 20 26 26 20 70 4b 65  x7fffffff && pKe
33dc0 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61 79  y!=0 );.    nPay
33dd0 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79  load = (int)nKey
33de0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
33df0 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
33e00 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  nt)nKey;.  }.  i
33e10 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
33e20 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
33e30 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
33e40 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
33e50 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
33e60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33e70 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
33e80 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
33e90 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
33ea0 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 50    spaceLeft = nP
33eb0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72 69  ayload;.    pPri
33ec0 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65  or = pCell;.  }e
33ed0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20  lse{.    int mn 
33ee0 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
33ef0 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20  l;.    n = mn + 
33f00 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20  (nPayload - mn) 
33f10 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
33f20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
33f30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
33f40 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
33f50 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
33f60 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
33f70 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
33f80 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
33f90 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
33fa0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
33fb0 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  n;.    *pnSize =
33fc0 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34   n + nHeader + 4
33fd0 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 26  ;.    pPrior = &
33fe0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d  pCell[nHeader+n]
33ff0 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64  ;.  }.  pPayload
34000 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34010 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  r];..  /* At thi
34020 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65  s point variable
34030 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  s should be set 
34040 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
34050 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64  .  **   nPayload
34060 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c             Total
34070 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e   payload size in
34080 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50   bytes.  **   pP
34090 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
340a0 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70   Begin writing p
340b0 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a  ayload here.  **
340c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20     spaceLeft    
340d0 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69        Space avai
340e0 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61  lable at pPayloa
340f0 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e  d.  If nPayload>
34100 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20  spaceLeft,.  ** 
34110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34120 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20       that means 
34130 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69  content must spi
34140 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ll into overflow
34150 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a   pages..  **   *
34160 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
34170 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f    Size of the lo
34180 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f  cal cell (not co
34190 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  unting overflow 
341a0 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50  pages).  **   pP
341b0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20  rior            
341c0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
341d0 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  the pgno of the 
341e0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
341f0 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73  age.  **.  ** Us
34200 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  e a call to btre
34210 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
34220 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
34230 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a  he values above.
34240 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74    ** were comput
34250 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ed correctly..  
34260 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  */.#if SQLITE_DE
34270 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
34280 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
34290 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
342a0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
342b0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
342c0 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74  t( nHeader==(int
342d0 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
342e0 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
342f0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
34300 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  y==nKey );.    a
34310 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
34320 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
34330 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
34340 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
34350 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ocal );.  }.#end
34360 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
34370 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
34380 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
34390 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
343a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
343b0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
343c0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
343d0 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
343e0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
343f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34400 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
34410 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
34420 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
34430 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
34440 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
34450 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
34460 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
34470 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
34480 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
34490 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
344a0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
344b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
344c0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
344d0 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
344e0 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
344f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
34500 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
34510 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
34520 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
34530 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
34540 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
34550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
34560 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
34570 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
34580 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
34590 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
345a0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
345b0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
345c0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
345d0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
345e0 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
345f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
34600 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
34610 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
34620 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
34630 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
34640 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
34650 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
34660 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
34670 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
34680 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
34690 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
346a0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
346b0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
346c0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
346d0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
346e0 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
346f0 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
34700 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
34710 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
34720 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
34730 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
34740 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
34750 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
34760 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
34770 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
34780 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
34790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
347a0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
347b0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
347c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
347d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
347e0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
347f0 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
34800 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
34810 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
34820 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
34830 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
34840 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
34850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
34860 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
34870 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
34880 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
34890 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
348a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
348b0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
348c0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
348d0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
348e0 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
348f0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
34900 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34910 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34920 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34930 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34940 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34950 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
34960 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34970 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
34980 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
34990 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
349a0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
349b0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
349c0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
349d0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
349e0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
349f0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
34a00 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
34a10 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
34a20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
34a30 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34a40 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
34a50 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34a60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
34a70 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
34a80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
34a90 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
34aa0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
34ab0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34ac0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
34ad0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
34ae0 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
34af0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
34b00 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
34b10 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
34b20 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
34b30 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
34b40 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
34b50 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
34b60 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
34b70 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
34b80 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
34b90 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
34ba0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
34bb0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
34bc0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
34bd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
34be0 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
34bf0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
34c00 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
34c10 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34c20 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
34c30 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34c40 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34c50 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34c60 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34c70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
34c80 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
34c90 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34ca0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34cb0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34cc0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
34cd0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
34ce0 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
34cf0 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
34d00 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
34d10 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34d20 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34d30 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34d40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34d50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34d60 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
34d70 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
34d80 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
34d90 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
34da0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
34db0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
34dc0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
34dd0 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
34de0 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
34df0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
34e00 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
34e10 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
34e20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
34e30 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
34e40 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
34e50 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
34e60 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
34e70 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
34e80 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
34e90 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
34ea0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34eb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34ec0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
34ed0 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
34ee0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
34ef0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
34f00 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
34f10 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
34f20 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
34f30 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
34f40 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
34f50 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
34f60 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
34f70 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
34f80 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
34f90 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
34fa0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
34fb0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
34fc0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
34fd0 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
34fe0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
34ff0 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
35000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
35010 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
35020 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
35030 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
35040 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
35050 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
35060 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
35070 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
35080 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
35090 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
350a0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
350b0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
350c0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
350d0 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
350e0 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
350f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35100 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
35110 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
35120 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
35130 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
35140 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
35150 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
35160 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
35170 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
35180 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
35190 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
351a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
351b0 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
351c0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
351d0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
351e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
351f0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
35200 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
35210 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35220 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
35230 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35240 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
35250 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
35260 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
35270 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
35280 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
35290 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
352a0 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
352b0 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
352c0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
352d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
352e0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
352f0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
35300 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
35310 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
35320 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
35330 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
35340 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
35350 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
35360 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
35370 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
35380 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
35390 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
353a0 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
353b0 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
353c0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
353d0 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
353e0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
353f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
35400 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
35410 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
35420 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
35430 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
35440 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
35450 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
35460 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
35470 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35480 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
35490 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
354b0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
354c0 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
354d0 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
354e0 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
354f0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
35500 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
35510 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
35520 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
35530 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
35540 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
35550 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
35560 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
35570 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
35580 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
35590 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
355a0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
355b0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
355c0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
355d0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
355e0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
355f0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
35600 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
35610 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
35620 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
35630 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
35640 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
35650 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
35660 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
35670 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
35680 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
35690 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
356a0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
356b0 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
356c0 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
356d0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
356e0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
356f0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
35700 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
35710 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
35720 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
35730 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
35740 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
35750 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73  ncremented..*/.s
35760 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
35770 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
35780 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
35790 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
357a0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
357b0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
357c0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
357d0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
357e0 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
357f0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
35800 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
35810 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
35820 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
35830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
35840 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
35850 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
35860 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
35870 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
35880 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
35890 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
358a0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
358b0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
358c0 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
358d0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
358e0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
358f0 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
35900 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
35910 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
35920 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
35930 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
35940 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
35950 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
35960 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
35970 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
35980 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35990 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ter */.  u8 *dat
359a0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
359b0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
359c0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
359d0 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20   u8 *pIns;      
359e0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
359f0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  in pPage->aCellI
35a00 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65  dx[] where no ce
35a10 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  ll inserted */..
35a20 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
35a30 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
35a40 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
35a50 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
35a60 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
35a70 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50  sert( MX_CELL(pP
35a80 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
35a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35aa0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
35ab0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
35ac0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
35ad0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35ae0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
35af0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35b00 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
35b10 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
35b20 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
35b30 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
35b40 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
35b50 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35b60 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
35b70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
35b80 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
35b90 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
35ba0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
35bb0 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
35bc0 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
35bd0 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
35be0 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
35bf0 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
35c00 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
35c10 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
35c20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
35c30 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
35c40 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
35c50 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
35c60 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
35c70 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
35c80 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
35c90 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
35ca0 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
35cb0 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
35cc0 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
35cd0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
35ce0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
35cf0 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  ==pPage->xCellSi
35d00 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ze(pPage, pCell)
35d10 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
35d20 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
35d30 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35d40 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
35d50 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
35d60 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
35d70 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70   memcpy(pTemp, p
35d80 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20  Cell, sz);.     
35d90 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
35da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
35db0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
35dc0 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
35dd0 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
35de0 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
35df0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
35e00 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
35e10 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
35e20 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
35e30 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  >apOvfl[0])) );.
35e40 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66      pPage->apOvf
35e50 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  l[j] = pCell;.  
35e60 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b    pPage->aiOvfl[
35e70 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20  j] = (u16)i;..  
35e80 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70    /* When multip
35e90 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63  le overflows occ
35ea0 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77  ur, they are alw
35eb0 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61  ays sequential a
35ec0 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72  nd in.    ** sor
35ed0 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ted order.  This
35ee0 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73   invariants aris
35ef0 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70  e because multip
35f00 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e  le overflows can
35f10 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63  .    ** only occ
35f20 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e  ur when insertin
35f30 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  g divider cells 
35f40 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
35f50 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20  page during.    
35f60 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e  ** balancing, an
35f70 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61  d the dividers a
35f80 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20  re adjacent and 
35f90 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  sorted..    */. 
35fa0 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
35fb0 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  || pPage->aiOvfl
35fc0 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20  [j-1]<(u16)i ); 
35fd0 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20  /* Overflows in 
35fe0 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a  sorted order */.
35ff0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
36000 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69   || i==pPage->ai
36010 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20  Ovfl[j-1]+1 );  
36020 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72   /* Overflows ar
36030 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a  e sequential */.
36040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
36050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36060 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
36070 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
36080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36090 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
360a0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
360b0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
360c0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
360d0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
360e0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
360f0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
36100 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  aData;.    asser
36110 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  t( &data[pPage->
36120 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61  cellOffset]==pPa
36130 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a  ge->aCellIdx );.
36140 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
36150 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
36160 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
36170 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
36180 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
36190 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
361a0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
361b0 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
361c0 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69  llowing properti
361d0 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
361e0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
361f0 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  ully */.    asse
36200 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a  rt( idx >= 0 );.
36210 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
36220 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  >= pPage->cellOf
36230 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43  fset+2*pPage->nC
36240 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54  ell+2 || CORRUPT
36250 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _DB );.    asser
36260 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
36270 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
36280 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
36290 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
362a0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
362b0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
362c0 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  idx], pCell, sz)
362d0 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
362e0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
362f0 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
36300 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
36310 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e    pIns = pPage->
36320 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a  aCellIdx + i*2;.
36330 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73      memmove(pIns
36340 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61  +2, pIns, 2*(pPa
36350 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b  ge->nCell - i));
36360 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 49  .    put2byte(pI
36370 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50  ns, idx);.    pP
36380 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
36390 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74    /* increment t
363a0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f  he cell count */
363b0 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61  .    if( (++data
363c0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
363d0 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b  t+4])==0 ) data[
363e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
363f0 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  +3]++;.    asser
36400 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
36410 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
36420 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e  et+3])==pPage->n
36430 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20  Cell );.#ifndef 
36440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
36450 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
36460 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
36470 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
36480 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
36490 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
364a0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
364b0 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
364c0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
364d0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
364e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
364f0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
36500 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36510 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
36520 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
36530 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
36540 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
36550 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65  A CellArray obje
36560 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61  ct contains a ca
36570 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  che of pointers 
36580 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a  and sizes for a.
36590 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73  ** consecutive s
365a0 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73  equence of cells
365b0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68   that might be h
365c0 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  eld multiple pag
365d0 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  es..*/.typedef s
365e0 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
365f0 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63  CellArray;.struc
36600 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20  t CellArray {.  
36610 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
36620 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36630 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
36640 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  Cell[] */.  MemP
36650 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20  age *pRef;      
36660 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
36670 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
36680 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
36690 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
366a0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
366b0 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
366c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
366d0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
366e0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
366f0 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
36700 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65  Make sure the ce
36710 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c  ll sizes at idx,
36720 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78   idx+1, ..., idx
36730 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a  +N-1 have been.*
36740 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  * computed..*/.s
36750 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c  tatic void popul
36760 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c  ateCellCache(Cel
36770 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69  lArray *p, int i
36780 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  dx, int N){.  as
36790 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
367a0 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20  idx+N<=p->nCell 
367b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  );.  while( N>0 
367c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
367d0 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30  ->apCell[idx]!=0
367e0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   );.    if( p->s
367f0 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b  zCell[idx]==0 ){
36800 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c  .      p->szCell
36810 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  [idx] = p->pRef-
36820 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
36830 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  ef, p->apCell[id
36840 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  x]);.    }else{.
36850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
36860 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20  RRUPT_DB ||.    
36870 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43            p->szC
36880 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65  ell[idx]==p->pRe
36890 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
368a0 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
368b0 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20  idx]) );.    }. 
368c0 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d     idx++;.    N-
368d0 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
368e0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
368f0 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65  of the Nth eleme
36900 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  nt of the cell a
36910 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53  rray.*/.static S
36920 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75  QLITE_NOINLINE u
36930 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  16 computeCellSi
36940 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  ze(CellArray *p,
36950 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36960 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e  t( N>=0 && N<p->
36970 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
36980 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d  t( p->szCell[N]=
36990 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c  =0 );.  p->szCel
369a0 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  l[N] = p->pRef->
369b0 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
369c0 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29  f, p->apCell[N])
369d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ;.  return p->sz
369e0 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69  Cell[N];.}.stati
369f0 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c  c u16 cachedCell
36a00 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
36a10 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
36a20 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
36a30 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
36a40 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20   p->szCell[N] ) 
36a50 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
36a60 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f  [N];.  return co
36a70 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c  mputeCellSize(p,
36a80 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   N);.}../*.** Ar
36a90 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
36aa0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
36ab0 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70  o nCell b-tree p
36ac0 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a  age cells. The .
36ad0 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61  ** szCell[] arra
36ae0 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
36af0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
36b00 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  each cell. This 
36b10 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c  function.** repl
36b20 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aces the current
36b30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
36b40 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63  e pPg with the c
36b50 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
36b60 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a  ell.** array..**
36b70 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  .** Some of the 
36b80 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
36b90 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  ] may currently 
36ba0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67  be stored in pPg
36bb0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
36bc0 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20  on works around 
36bd0 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
36be0 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e  by this by makin
36bf0 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  g a copy of any 
36c00 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62  .** such cells b
36c10 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
36c20 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  g the page data.
36c30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61  .**.** The MemPa
36c40 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  ge.nFree field i
36c50 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
36c60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
36c70 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
36c80 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
36c90 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
36ca0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
36cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
36cc0 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d  buildPage(.  Mem
36cd0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36cf0 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
36d00 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
36d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
36d30 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
36d40 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
36d50 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
36d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36d70 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
36d80 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36da0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
36db0 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
36dc0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
36dd0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  pPg->hdrOffset; 
36de0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
36df0 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
36e00 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  pPg */.  u8 * co
36e10 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
36e20 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
36e30 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
36e40 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
36e50 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62    const int usab
36e60 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
36e70 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
36e80 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
36e90 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65   = &aData[usable
36ea0 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  Size];.  int i;.
36eb0 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
36ec0 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a   pPg->aCellIdx;.
36ed0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
36ee0 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
36ef0 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
36f00 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74  ger);.  u8 *pDat
36f10 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79  a;..  i = get2by
36f20 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36f30 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d  );.  memcpy(&pTm
36f40 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c  p[i], &aData[i],
36f50 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29   usableSize - i)
36f60 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e  ;..  pData = pEn
36f70 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  d;.  for(i=0; i<
36f80 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
36f90 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
36fa0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
36fb0 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43  SQLITE_WITHIN(pC
36fc0 65 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64 29 20  ell,aData,pEnd) 
36fd0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  ){.      pCell =
36fe0 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61   &pTmp[pCell - a
36ff0 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Data];.    }.   
37000 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c   pData -= szCell
37010 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74  [i];.    put2byt
37020 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61  e(pCellptr, (pDa
37030 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ta - aData));.  
37040 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
37050 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 3c  .    if( pData <
37060 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75   pCellptr ) retu
37070 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
37080 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63  T_BKPT;.    memc
37090 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c  py(pData, pCell,
370a0 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   szCell[i]);.   
370b0 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b   assert( szCell[
370c0 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69  i]==pPg->xCellSi
370d0 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c  ze(pPg, pCell) |
370e0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
370f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a      testcase( sz
37100 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43  Cell[i]!=pPg->xC
37110 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c  ellSize(pPg,pCel
37120 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  l) );.  }..  /* 
37130 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
37140 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20  ield is now set 
37150 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65  incorrectly. The
37160 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78   caller will fix
37170 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e   it. */.  pPg->n
37180 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  Cell = nCell;.  
37190 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  pPg->nOverflow =
371a0 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28   0;..  put2byte(
371b0 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  &aData[hdr+1], 0
371c0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
371d0 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67  Data[hdr+3], pPg
371e0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  ->nCell);.  put2
371f0 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
37200 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74  5], pData - aDat
37210 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b  a);.  aData[hdr+
37220 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74  7] = 0x00;.  ret
37230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37240 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
37250 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
37260 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
37270 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
37280 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20  Array szCell.** 
37290 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a  contains the siz
372a0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61  e in bytes of ea
372b0 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68  ch such cell. Th
372c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
372d0 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20  mpts to .** add 
372e0 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64  the cells stored
372f0 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f   in the array to
37300 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74   page pPg. If it
37310 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65   cannot (because
37320 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65   .** the page ne
37330 65 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67  eds to be defrag
37340 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68  mented before th
37350 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74  e cells will fit
37360 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69  ), non-zero.** i
37370 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
37380 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65  rwise, if the ce
37390 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75  lls are added su
373a0 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f  ccessfully, zero
373b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
373c0 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
373d0 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20  pCellptr points 
373e0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
373f0 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70  ry in the cell-p
37400 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20  ointer array.** 
37410 28 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50  (part of page pP
37420 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20  g) to populate. 
37430 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c  After cell apCel
37440 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20  l[0] is written 
37450 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62  to the.** page b
37460 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66  ody, a 16-bit of
37470 66 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20  fset is written 
37480 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64  to pCellptr. And
37490 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68   so on, for each
374a0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  .** cell in the 
374b0 61 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65  array. It is the
374c0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
374d0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
374e0 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20   ensure.** that 
374f0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
37500 65 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72  erwrite this par
37510 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f  t of the cell-po
37520 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a  inter array..**.
37530 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
37540 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
37550 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20   *ppData points 
37560 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37570 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  the .** content 
37580 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67  area on page pPg
37590 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
375a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
375b0 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a  a is extended,.*
375c0 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64  * *ppData is upd
375d0 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  ated to point to
375e0 20 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f   the new start o
375f0 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72  f the content ar
37600 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  ea.** before ret
37610 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69  urning..**.** Fi
37620 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20  nally, argument 
37630 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f  pBegin points to
37640 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   the byte immedi
37650 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
37660 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
37670 65 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  e space required
37680 20 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f   by this page fo
37690 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  r the cell-point
376a0 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20  er area (for.** 
376b0 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20  all cells - not 
376c0 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72  just those inser
376d0 74 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ted by the curre
376e0 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65  nt call). If the
376f0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61   content.** area
37700 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65   must be extende
37710 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73  d to before this
37720 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
37730 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c  to accomodate al
37740 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70  l.** cells in ap
37750 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65  Cell[], then the
37760 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69   cells do not fi
37770 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69  t and non-zero i
37780 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
37790 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
377a0 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d  sertArray(.  Mem
377b0 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
377c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
377d0 50 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c  Page to add cell
377e0 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42  s to */.  u8 *pB
377f0 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20  egin,           
37800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
37810 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   of cell-pointer
37820 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a   array */.  u8 *
37830 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20  *ppData,        
37840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
37850 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74  N/OUT: Page cont
37860 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65  ent -area pointe
37870 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
37880 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
37890 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
378a0 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65  r to cell-pointe
378b0 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  r area */.  int 
378c0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
378d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
378e0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
378f0 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  ll to add */.  i
37900 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
37910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37920 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
37930 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20  s to add to pPg 
37940 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a  */.  CellArray *
37950 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20  pCArray         
37960 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
37970 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
37980 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74  nt i;.  u8 *aDat
37990 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
379a0 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70    u8 *pData = *p
379b0 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e  pData;.  int iEn
379c0 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65  d = iFirst + nCe
379d0 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f  ll;.  assert( CO
379e0 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d  RRUPT_DB || pPg-
379f0 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b  >hdrOffset==0 );
37a00 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c      /* Never cal
37a10 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f  led on page 1 */
37a20 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
37a30 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
37a40 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20     int sz, rc;. 
37a50 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20     u8 *pSlot;.  
37a60 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c    sz = cachedCel
37a70 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69  lSize(pCArray, i
37a80 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61 74  );.    if( (aDat
37a90 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61  a[1]==0 && aData
37aa0 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f  [2]==0) || (pSlo
37ab0 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  t = pageFindSlot
37ac0 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30  (pPg,sz,&rc))==0
37ad0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
37ae0 44 61 74 61 20 2d 20 70 42 65 67 69 6e 29 3c 73  Data - pBegin)<s
37af0 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  z ) return 1;.  
37b00 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b      pData -= sz;
37b10 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70  .      pSlot = p
37b20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
37b30 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20 70 43 41  /* pSlot and pCA
37b40 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20  rray->apCell[i] 
37b50 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c  will never overl
37b60 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ap on a well-for
37b70 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  med.    ** datab
37b80 61 73 65 2e 20 20 42 75 74 20 74 68 65 79 20 6d  ase.  But they m
37b90 69 67 68 74 20 66 6f 72 20 61 20 63 6f 72 72 75  ight for a corru
37ba0 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 48 65  pt database.  He
37bb0 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28  nce use memmove(
37bc0 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d  ).    ** since m
37bd0 65 6d 63 70 79 28 29 20 73 65 6e 64 73 20 53 49  emcpy() sends SI
37be0 47 41 42 4f 52 54 20 77 69 74 68 20 6f 76 65 72  GABORT with over
37bf0 6c 61 70 70 69 6e 67 20 62 75 66 66 65 72 73 20  lapping buffers 
37c00 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20  on OpenBSD */.  
37c10 20 20 61 73 73 65 72 74 28 20 28 70 53 6c 6f 74    assert( (pSlot
37c20 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61  +sz)<=pCArray->a
37c30 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20  pCell[i].       
37c40 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41    || pSlot>=(pCA
37c50 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b  rray->apCell[i]+
37c60 73 7a 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  sz).         || 
37c70 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
37c80 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c    memmove(pSlot,
37c90 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37ca0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75  [i], sz);.    pu
37cb0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
37cc0 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29   (pSlot - aData)
37cd0 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
37ce0 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  += 2;.  }.  *ppD
37cf0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72  ata = pData;.  r
37d00 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
37d10 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37d20 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
37d30 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
37d40 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
37d50 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61  szCell .** conta
37d60 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
37d70 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
37d80 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
37d90 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a  nction adds the.
37da0 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61  ** space associa
37db0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65  ted with each ce
37dc0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ll in the array 
37dd0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
37de0 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74  y stored .** wit
37df0 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20  hin the body of 
37e00 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66  pPg to the pPg f
37e10 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65  ree-list. The ce
37e20 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll-pointers and 
37e30 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20  other.** fields 
37e40 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20  of the page are 
37e50 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  not updated..**.
37e60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37e70 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
37e80 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
37e90 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ls added to the 
37ea0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free-list..*/.st
37eb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65  atic int pageFre
37ec0 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  eArray(.  MemPag
37ed0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
37ef0 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69  e to edit */.  i
37f00 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
37f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37f20 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  * First cell to 
37f30 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
37f40 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
37f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
37f60 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ells to delete *
37f70 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
37f80 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
37f90 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
37fa0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  cells */.){.  u8
37fb0 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
37fc0 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37fd0 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
37fe0 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74   &aData[pPg->pBt
37ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
38000 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61   u8 * const pSta
38010 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  rt = &aData[pPg-
38020 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b  >hdrOffset + 8 +
38030 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69   pPg->childPtrSi
38040 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20  ze];.  int nRet 
38050 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
38060 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73  int iEnd = iFirs
38070 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  t + nCell;.  u8 
38080 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e  *pFree = 0;.  in
38090 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20  t szFree = 0;.. 
380a0 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69   for(i=iFirst; i
380b0 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <iEnd; i++){.   
380c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41   u8 *pCell = pCA
380d0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b  rray->apCell[i];
380e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
380f0 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53  WITHIN(pCell, pS
38100 74 61 72 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20  tart, pEnd) ){. 
38110 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
38120 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
38130 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c 53   use cachedCellS
38140 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68 65  ize() here.  The
38150 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65   sizes of all ce
38160 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lls that.      *
38170 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65 65  * are to be free
38180 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
38190 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77 68  een computing wh
381a0 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68 69  ile deciding whi
381b0 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  ch.      ** cell
381c0 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20 2a  s need freeing *
381d0 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43 41  /.      sz = pCA
381e0 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b  rray->szCell[i];
381f0 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20 29    assert( sz>0 )
38200 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
38210 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
38220 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
38230 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
38240 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
38250 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
38260 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
38270 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
38280 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
38290 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
382a0 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
382b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
382c0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
382d0 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
382e0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
382f0 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
38300 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
38310 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
38320 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
38330 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
38340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
38350 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
38360 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
38370 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
38380 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
38390 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
383a0 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
383b0 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
383c0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
383d0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
383e0 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
383f0 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
38400 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
38410 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
38420 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
38430 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
38440 6