/ Hex Artifact Content
Login

Artifact 16a5f4fd303cad1112cfb5d08389687212e7d6f32f31fcd89986e8af688029ee:


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 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20  Pgno pgnoRoot,  
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
4300: 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20  able that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4330: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4340: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4350: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4360: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4370: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4380: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
4390: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
43a0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
43b0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
43c0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
43d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
43e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
43f0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4400: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4410: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4420: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4430: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4440: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4450: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4460: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4470: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4480: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
4490: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
44a0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
44b0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f  ->pgnoRoot==pgno
44c0: 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72  Root && (isClear
44d0: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
44e0: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a  .nKey==iRow) ){.
44f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4500: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
4510: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
4520: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4530: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4540: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4550: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4560: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4570: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4580: 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  s(w,x,y,z).#endi
4590: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
45a0: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
45b0: 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f  .** Set bit pgno
45c0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
45d0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
45e0: 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c  vec. This is cal
45f0: 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70  led .** when a p
4600: 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75  age that previou
4610: 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61  sly contained da
4620: 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ta becomes a fre
4630: 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20  e-list leaf .** 
4640: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
4650: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4660: 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73  tent bitvec exis
4670: 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ts to work aroun
4680: 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20  d an obscure.** 
4690: 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68  bug caused by th
46a0: 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66  e interaction of
46b0: 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f   two useful IO o
46c0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72  ptimizations sur
46d0: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65  rounding.** free
46e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
46f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
4700: 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65  n all data is de
4710: 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67  leted from a pag
4720: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  e and the page b
4730: 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61  ecomes.**      a
4740: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4750: 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69  page, the page i
4760: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
4770: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
4780: 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c        (as free-l
4790: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63  ist leaf pages c
47a0: 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e  ontain no meanin
47b0: 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65  gful data). Some
47c0: 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75  times.**      su
47d0: 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74  ch a page is not
47e0: 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64   even journalled
47f0: 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74   (as it will not
4800: 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   be modified,.**
4810: 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72        why bother
4820: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f   journalling it?
4830: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  )..**.**   2) Wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73  eaf page is reus
4860: 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ed, its content 
4870: 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20  is not read.**  
4880: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74      from the dat
4890: 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e  abase or written
48a0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
48b0: 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64  file (why should
48c0: 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20   it.**      be, 
48d0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
48e0: 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29  all meaningful?)
48f0: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73  ..**.** By thems
4900: 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74  elves, these opt
4910: 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20  imizations work 
4920: 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65  fine and provide
4930: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
4940: 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f  ormance boost to
4950: 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20   bulk delete or 
4960: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
4970: 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a  s. However, if.*
4980: 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  * a page is move
4990: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
49a0: 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73  st and then reus
49b0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ed within the sa
49c0: 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  me.** transactio
49d0: 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d  n, a problem com
49e0: 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61  es up. If the pa
49f0: 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61  ge is not journa
4a00: 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20  lled when.** it 
4a10: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4a20: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74  free-list and it
4a30: 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75   is also not jou
4a40: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a  rnalled when it.
4a50: 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ** is extracted 
4a60: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4a70: 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74  st and reused, t
4a80: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
4a90: 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20   data.** may be 
4aa0: 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65  lost. In the eve
4ab0: 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
4ac0: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
4ad0: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72  possible.** to r
4ae0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4af0: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
4b00: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
4b10: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c  n..**.** The sol
4b20: 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53  ution is the BtS
4b30: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4b40: 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  t bitvec. Whenev
4b50: 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a  er a page is .**
4b60: 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65   moved to become
4b70: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4b80: 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72  f page, the corr
4b90: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
4ba0: 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62  .** set in the b
4bb0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4bc0: 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65  a leaf page is e
4bd0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
4be0: 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20  e free-list,.** 
4bf0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61  optimization 2 a
4c00: 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20  bove is omitted 
4c10: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4c20: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4c30: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4c40: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4c50: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4c60: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4c70: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4c80: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
4c90: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
4ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4cb0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
4cc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4cd0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
4ce0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4cf0: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4d00: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4d10: 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42  assert( pgno<=pB
4d20: 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  t->nPage );.    
4d30: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4d40: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4d50: 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67  Create(pBt->nPag
4d60: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74  e);.    if( !pBt
4d70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4d80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4d90: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
4da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
4db0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4dc0: 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74  pgno<=sqlite3Bit
4dd0: 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61  vecSize(pBt->pHa
4de0: 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20  sContent) ){.   
4df0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
4e00: 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73  vecSet(pBt->pHas
4e10: 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a  Content, pgno);.
4e20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
4e40: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e50: 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e  sContent vector.
4e60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4e70: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
4e80: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
4e90: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d  leaf page is rem
4ea0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  oved from the.**
4eb0: 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72   free-list for r
4ec0: 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  euse. It returns
4ed0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
4ee0: 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65  safe to retrieve
4ef0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f   the.** page fro
4f00: 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
4f10: 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
4f20: 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
4f30: 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65  . True otherwise
4f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f50: 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
4f60: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4f70: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4f80: 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d  Bitvec *p = pBt-
4f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20  >pHasContent;.  
4fa0: 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67  return (p && (pg
4fb0: 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63  no>sqlite3Bitvec
4fc0: 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74  Size(p) || sqlit
4fd0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20  e3BitvecTest(p, 
4fe0: 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pgno)));.}../*.*
4ff0: 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79  * Clear (destroy
5000: 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  ) the BtShared.p
5010: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
5020: 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  c. This should b
5030: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20  e.** invoked at 
5040: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
5050: 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61  f each write-tra
5060: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
5070: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c  tic void btreeCl
5080: 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  earHasContent(Bt
5090: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
50a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
50b0: 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f  troy(pBt->pHasCo
50c0: 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70  ntent);.  pBt->p
50d0: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a  HasContent = 0;.
50e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
50f0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61   all of the apPa
5100: 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61  ge[] pages for a
5110: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
5120: 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c  ic void btreeRel
5130: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5140: 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  es(BtCursor *pCu
5150: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
5160: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
5170: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
5180: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
5190: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
51a0: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
51b0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  [i] = 0;.  }.  p
51c0: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
51d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
51e0: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
51f0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5200: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5210: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5220: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
5230: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
5240: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
5250: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
5260: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5270: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
5280: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5290: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
52a0: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
52b0: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
52c0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
52d0: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
52e0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
52f0: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5300: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5310: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5320: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
5330: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
5340: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
5350: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
5360: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
5370: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
5380: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5390: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
53a0: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
53b0: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
53c0: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
53d0: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
53e0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
53f0: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5400: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5410: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5420: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
5430: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
5440: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
5450: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5470: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
5480: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5490: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
54a0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
54b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
54c0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
54d0: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
54e0: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
54f0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5500: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5510: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5520: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5530: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5540: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5550: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5560: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5570: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5580: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5590: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
55a0: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
55b0: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
55c0: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
55d0: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
55e0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
55f0: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5600: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5610: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5620: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5630: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5640: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5650: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5660: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5670: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5680: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
56a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
56b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
56c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
56d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
56e0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
56f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5700: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5710: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5720: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5730: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5740: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5750: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5760: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5770: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5780: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5790: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
57a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
57b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
57c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
57d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
57e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
57f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5800: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5810: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5820: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5830: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5840: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5850: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5860: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5870: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5880: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5890: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
58a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
58b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
58c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
58d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
58e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
58f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5900: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5910: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5920: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5930: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5940: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5950: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5960: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5970: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5980: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5990: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
59a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
59b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
59c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
59d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
59e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
59f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5a00: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5a10: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5a20: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5a30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5a40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5a50: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5a60: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5a70: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5a80: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5a90: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5aa0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5ab0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5ac0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5ad0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5ae0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5af0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5b00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5b10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5b20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5b30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5b40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5b50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5b60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5b70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5b80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5b90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5ba0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5bb0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5bc0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5bd0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5be0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5bf0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5c00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5c10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5c20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5c30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5c40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5c50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5c60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5c70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5c80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5c90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ca0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5cb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5cc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5cd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5ce0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5cf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5d00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5d10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5d20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5d30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5d40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5d50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5d60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5d70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5d80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5d90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5da0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5db0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5dc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5dd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5de0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5df0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5e00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5e10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5e20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5e30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5e40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5e50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5e60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5e70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5e80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5e90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5ea0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5eb0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5ec0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5ed0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5ef0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5f00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5f10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5f20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5f30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5f40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5f50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5f60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5f70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5f80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5f90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5fa0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5fb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5fc0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5fd0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5fe0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ff0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6000: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6010: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6020: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
6030: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
6040: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
6050: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
6060: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
6070: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6080: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6090: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
60a0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
60b0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
60c0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
60d0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
60e0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
60f0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6100: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6110: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6120: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6130: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6140: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6150: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6160: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6170: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6180: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6190: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
61a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
61b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
61c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
61d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
61e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
61f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6200: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6210: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6220: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6230: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6240: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6250: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6260: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6270: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6280: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6290: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
62a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
62b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
62c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
62d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
62e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6310: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6320: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6330: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6340: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6350: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6360: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6370: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
63a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
63b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
63c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
63d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
63e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
63f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6400: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6420: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6430: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6440: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6450: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6460: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6470: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6480: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6490: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
64a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
64b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
64c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
64d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
64e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
64f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6500: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6510: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6520: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6530: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6540: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6550: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6560: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6570: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6580: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6590: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
65a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
65b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
65c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
65d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
65e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
65f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6600: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6610: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6620: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6630: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6640: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6650: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6670: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6680: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6690: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
66a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
66b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
66c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
66d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
66e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
66f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6700: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6710: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6740: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6750: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6760: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6770: 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20  x key */..  if( 
6780: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
6790: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
67a0: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
67b0: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
67c0: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
67d0: 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70  edRecord(pCur->p
67e0: 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66  KeyInfo);.    if
67f0: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
6800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6810: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c  EM_BKPT;.    sql
6820: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
6830: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
6840: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
6850: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
6860: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
6870: 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20  >nField==0 ){.  
6880: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6890: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
68a0: 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
68b0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  done;.    }.  }e
68c0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
68d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
68e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
68f0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
6900: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
6910: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f   bias, pRes);.mo
6920: 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28  veto_done:.  if(
6930: 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
6940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6950: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6960: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a  , pIdxKey);.  }.
6970: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6980: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
6990: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
69a0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
69b0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
69c0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
69d0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
69e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
69f0: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
6a00: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
6a10: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
6a20: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
6a30: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
6a40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
6a50: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
6a60: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
6a70: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
6a80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a90: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
6aa0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
6ab0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73  Position()..*/.s
6ac0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52  tatic int btreeR
6ad0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6ae0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
6af0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
6b00: 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a    int skipNext;.
6b10: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6b20: 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
6b30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
6b40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
6b50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6b60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
6b70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
6b80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
6b90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
6ba0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
6bb0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6bc0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
6bd0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
6be0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
6bf0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69  r->nKey, 0, &ski
6c00: 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63  pNext);.  if( rc
6c10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6c20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6c30: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
6c40: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6c50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
6c60: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6c70: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
6c80: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6c90: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70  INVALID );.    p
6ca0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d  Cur->skipNext |=
6cb0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
6cc0: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
6cd0: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
6ce0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
6cf0: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
6d00: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
6d10: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
6d20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6d30: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
6d40: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6d50: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
6d60: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
6d70: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
6d80: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
6d90: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
6da0: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
6db0: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
6dc0: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
6dd0: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
6de0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
6df0: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
6e00: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
6e10: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
6e20: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
6e30: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
6e40: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
6e50: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
6e60: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
6e70: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
6e80: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
6e90: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
6ea0: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
6eb0: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
6ec0: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
6ed0: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
6ee0: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
6ef0: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
6f00: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
6f10: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
6f20: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
6f30: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
6f40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f50: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
6f60: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
6f70: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
6f80: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
6f90: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
6fa0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
6fb0: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
6fc0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6fd0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
6fe0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
6ff0: 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  rn pCur->eState!
7000: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7020: 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20  tine restores a 
7030: 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69  cursor back to i
7040: 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69  ts original posi
7050: 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a  tion after it.**
7060: 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20   has been moved 
7070: 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20  by some outside 
7080: 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61  activity (such a
7090: 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61  s a btree rebala
70a0: 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20  nce or.** a row 
70b0: 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65  having been dele
70c0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
70d0: 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20  er the cursor). 
70e0: 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65   .**.** On succe
70f0: 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72  ss, the *pDiffer
7100: 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72  entRow parameter
7110: 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
7120: 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a   cursor is left.
7130: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65  ** pointing at e
7140: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
7150: 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74  row.  *pDiffernt
7160: 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74  Row is the row t
7170: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
7180: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73   pointing to has
7190: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66   been deleted, f
71a0: 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f  orcing the curso
71b0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f  r to point to so
71c0: 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77  me.** nearby row
71d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
71e0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
71f0: 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   be called for a
7200: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73   cursor that jus
7210: 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52  t returned.** TR
7220: 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  UE from sqlite3B
7230: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7240: 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ed()..*/.int sql
7250: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
7260: 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20  estore(BtCursor 
7270: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66  *pCur, int *pDif
7280: 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e  ferentRow){.  in
7290: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
72a0: 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73   pCur!=0 );.  as
72b0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
72c0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
72d0: 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
72e0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
72f0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
7300: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
7310: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  entRow = 1;.    
7320: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7330: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
7340: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7360: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c  ntRow = 1;.  }el
7370: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7380: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
7390: 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65  0 );.    *pDiffe
73a0: 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d  rentRow = 0;.  }
73b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
73c0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
73d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
73e0: 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
73f0: 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f  Provide hints to
7400: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
7410: 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e  e particular hin
7420: 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65  t given (and the
7430: 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d   type.** and num
7440: 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72  ber of the varar
7450: 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69  gs parameters) i
7460: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7470: 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a  the eHintType.**
7480: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65   parameter.  See
7490: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
74a0: 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49   of the BTREE_HI
74b0: 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20  NT_* macros for 
74c0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64  details..*/.void
74d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
74e0: 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72  sorHint(BtCursor
74f0: 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e   *pCur, int eHin
7500: 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f  tType, ...){.  /
7510: 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  * Used only by s
7520: 79 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74  ystem that subst
7530: 69 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20  itute their own 
7540: 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a  storage engine *
7550: 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.}.#endif../*.*
7560: 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68  * Provide flag h
7570: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
7580: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
7590: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
75a0: 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  ntFlags(BtCursor
75b0: 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64   *pCur, unsigned
75c0: 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78   x){.  assert( x
75d0: 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
75e0: 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b  || x==BTREE_BULK
75f0: 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a  LOAD || x==0 );.
7600: 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20    pCur->hints = 
7610: 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  x;.}...#ifndef S
7620: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7630: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
7640: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
7650: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
7660: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
7670: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
7680: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
7690: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
76a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
76b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
76c0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
76d0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
76e0: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
76f0: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
7700: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
7710: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
7720: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
7730: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
7740: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
7750: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
7760: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
7770: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
7780: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
7790: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
77a0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
77b0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
77c0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
77d0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
77e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
77f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7800: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7810: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
7820: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
7830: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
7840: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
7850: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
7860: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
7870: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
7880: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
7890: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
78a0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
78b0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
78c0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
78d0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
78e0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
78f0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7900: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7910: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7920: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
7930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
7950: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
7960: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
7970: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
7980: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7990: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
79a0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
79b0: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
79c0: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
79d0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
79e0: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
79f0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7a00: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7a10: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7a20: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7a30: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7a40: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
7a50: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
7a60: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
7a70: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
7a80: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
7a90: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7aa0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7ab0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7ac0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7ad0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7ae0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7af0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7b00: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7b10: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7b20: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7b30: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7b40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
7b50: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
7b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7b70: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7b80: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
7b90: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
7ba0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7bc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7bd0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7be0: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7bf0: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7c00: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7c10: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7c20: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7c30: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7c40: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
7c50: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
7c60: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
7c70: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
7c80: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
7c90: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
7ca0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7cb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7cc0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7cd0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7ce0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7cf0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7d00: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7d10: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
7d20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7d30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
7d40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7d50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
7d60: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7d70: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7d80: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7d90: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7da0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7db0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
7dc0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
7dd0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
7de0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
7df0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
7e00: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
7e10: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
7e20: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
7e30: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
7e40: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
7e50: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7e60: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
7e70: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
7e80: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
7e90: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
7ea0: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
7eb0: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
7ec0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
7ed0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
7ee0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7ef0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
7f00: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
7f10: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
7f20: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7f30: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
7f40: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
7f50: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
7f60: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7f70: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
7f80: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
7f90: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7fb0: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
7fc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
7fd0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
7fe0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
7ff0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
8000: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
8010: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8020: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
8030: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
8040: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8050: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
8060: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
8070: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
8080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8090: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
80a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
80b0: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
80c0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
80d0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
80e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
80f0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
8100: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
8110: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8120: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
8130: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
8140: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8150: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
8160: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
8170: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
8180: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8190: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
81a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
81b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
81c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
81d0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
81e0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
81f0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
8200: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
8210: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
8220: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
8230: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8240: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8250: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
8260: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8270: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8280: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
8290: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
82a0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
82b0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
82c0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
82d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
82e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
82f0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8300: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
8310: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
8320: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
8330: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
8340: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
8350: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
8360: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
8370: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
8380: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8390: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
83a0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
83b0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
83c0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
83d0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
83e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
83f0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
8400: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8410: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8420: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8430: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8440: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8450: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8460: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8470: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8480: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8490: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
84a0: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
84b0: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
84c0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
84d0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
84e0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
84f0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
8500: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
8510: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
8520: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
8530: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8540: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
8550: 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73  *.** findCellPas
8560: 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20  tPtr() does the 
8570: 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73  same except it s
8580: 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e  kips past the in
8590: 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20  itial.** 4-byte 
85a0: 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f  child pointer fo
85b0: 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20  und on interior 
85c0: 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20  pages, if there 
85d0: 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  is one..**.** Th
85e0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
85f0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
8600: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
8610: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
8620: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
8630: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
8640: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
8690: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
86a0: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
86b0: 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29  aDataOfst + ((P)
86c0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
86d0: 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50  2byteAligned(&(P
86e0: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
86f0: 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  )]))).../*.** Th
8700: 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69  is is common tai
8710: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
8720: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8730: 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65  tr() and.** btre
8740: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8750: 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73  ex() for the cas
8760: 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  e when the cell 
8770: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74  does not fit ent
8780: 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69  irely.** on a si
8790: 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65  ngle B-tree page
87a0: 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72  .  Make necessar
87b0: 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f  y adjustments to
87c0: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a   the CellInfo.**
87d0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
87e0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
87f0: 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65  NLINE void btree
8800: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
8810: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a  izeForOverflow(.
8820: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8830: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8840: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8850: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8860: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8870: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8880: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8890: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
88a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
88b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
88c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f  ucture */.){.  /
88d0: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
88e0: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
88f0: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
8900: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
8910: 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69  ave.  ** to deci
8920: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
8930: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
8940: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
8950: 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65  ll onto.  ** ove
8960: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
8970: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
8980: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
8990: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
89a0: 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65   ** space on ove
89b0: 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c  rflow pages whil
89c0: 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d  e keeping the am
89d0: 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74  ount of local st
89e0: 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65  orage.  ** in be
89f0: 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61  tween minLocal a
8a00: 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a  nd maxLocal..  *
8a10: 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20  *.  ** Warning: 
8a20: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8a30: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8a40: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8a50: 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61  d in any.  ** wa
8a60: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
8a70: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
8a80: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
8a90: 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  */.  int minLoca
8aa0: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
8ab0: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
8ac0: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
8ad0: 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b  .  int maxLocal;
8ae0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8af0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8b00: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8b10: 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20   int surplus;   
8b20: 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c  /* Overflow payl
8b30: 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  oad available fo
8b40: 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20  r local storage 
8b50: 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d  */..  minLocal =
8b60: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8b70: 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ;.  maxLocal = p
8b80: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
8b90: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
8ba0: 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e  ocal + (pInfo->n
8bb0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
8bc0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
8bd0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a  >usableSize-4);.
8be0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8bf0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8c00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
8c10: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
8c20: 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75   );.  if( surplu
8c30: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
8c40: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
8c50: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
8c60: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8c70: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8c80: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
8c90: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   }.  pInfo->nSiz
8ca0: 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  e = (u16)(&pInfo
8cb0: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8cc0: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8cd0: 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l) + 4;.}../*.**
8ce0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
8cf0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
8d00: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
8d10: 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73  he MemPage.xPars
8d20: 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f  eCell().** metho
8d30: 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61  d..**.** Parse a
8d40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
8d50: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
8d60: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
8d70: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74  ucture..**.** bt
8d80: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8d90: 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61  )        =>   ta
8da0: 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e  ble btree leaf n
8db0: 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72  odes.** btreePar
8dc0: 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28  seCellNoPayload(
8dd0: 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74  )  =>   table bt
8de0: 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ree internal nod
8df0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8e00: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20  CellPtrIndex()  
8e10: 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65   =>   index btre
8e20: 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68  e nodes.**.** Th
8e30: 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72  ere is also a wr
8e40: 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62  apper function b
8e50: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
8e60: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
8e70: 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79  * all MemPage ty
8e80: 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66  pes and that ref
8e90: 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c  erences the cell
8ea0: 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72   by index rather
8eb0: 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e   than.** by poin
8ec0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
8ed0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
8ee0: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a  llPtrNoPayload(.
8ef0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8f00: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
8f10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
8f20: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
8f30: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
8f40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8f50: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
8f60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
8f70: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
8f80: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
8f90: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61  ucture */.){.  a
8fa0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8fb0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8fc0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8fd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8fe0: 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73  >leaf==0 );.  as
8ff0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9000: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
9010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44  #ifndef SQLITE_D
9020: 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41  EBUG.  UNUSED_PA
9030: 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a  RAMETER(pPage);.
9040: 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e  #endif.  pInfo->
9050: 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56  nSize = 4 + getV
9060: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
9070: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9080: 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  Key);.  pInfo->n
9090: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70  Payload = 0;.  p
90a0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
90b0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
90c0: 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  oad = 0;.  retur
90d0: 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  n;.}.static void
90e0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
90f0: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
9100: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9110: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9120: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9130: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9140: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9150: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9160: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9170: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9180: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9190: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
91a0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
91b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
91c0: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
91d0: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
91e0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
91f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9200: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
9210: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36   payload */.  u6
9220: 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20  4 iKey;         
9230: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
9240: 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a  ed Key value */.
9250: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9260: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9270: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9290: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
92a0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
92b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
92c0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
92d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
92e0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
92f0: 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70  0 );.  pIter = p
9300: 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  Cell;..  /* The 
9310: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9320: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9330: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9340: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9350: 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e  arint32(pIter, n
9360: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20  Payload);.  **. 
9370: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9380: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9390: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
93a0: 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  ..  */.  nPayloa
93b0: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
93c0: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
93d0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
93e0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
93f0: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
9400: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
9410: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
9420: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
9430: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9440: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49      }while( (*pI
9450: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
9460: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
9470: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a    pIter++;..  /*
9480: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9490: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
94a0: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
94b0: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
94c0: 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72   getVarint(pIter
94d0: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
94e0: 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  nKey);.  **.  **
94f0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
9500: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
9510: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
9520: 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49   */.  iKey = *pI
9530: 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e  ter;.  if( iKey>
9540: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
9550: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37  *pEnd = &pIter[7
9560: 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30  ];.    iKey &= 0
9570: 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31  x7f;.    while(1
9580: 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20  ){.      iKey = 
9590: 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b  (iKey<<7) | (*++
95a0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
95b0: 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72       if( (*pIter
95c0: 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a  )<0x80 ) break;.
95d0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e        if( pIter>
95e0: 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20  =pEnd ){.       
95f0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38   iKey = (iKey<<8
9600: 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20  ) | *++pIter;.  
9610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9630: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e   pIter++;..  pIn
9640: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34  fo->nKey = *(i64
9650: 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f  *)&iKey;.  pInfo
9660: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
9670: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9680: 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72  pPayload = pIter
9690: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
96a0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
96b0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
96c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
96d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
96e0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79  +1 );.  if( nPay
96f0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
9700: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
9710: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
9720: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
9730: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
9740: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
9750: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
9760: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
9770: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
9780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66  .    */.    pInf
9790: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c  o->nSize = nPayl
97a0: 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65  oad + (u16)(pIte
97b0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
97c0: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  if( pInfo->nSize
97d0: 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  <4 ) pInfo->nSiz
97e0: 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f  e = 4;.    pInfo
97f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9800: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
9810: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9820: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9830: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9840: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9850: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9860: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9870: 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d  lPtrIndex(.  Mem
9880: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9890: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
98a0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98b0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98e0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98f0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9900: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9910: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9920: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9930: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9940: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9950: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9960: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9970: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
9980: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
9990: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
99a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
99b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
99c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
99d0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
99e0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
99f0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9a00: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9a10: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9a20: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9a30: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
9a40: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
9a50: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9a60: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
9a70: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
9a80: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9a90: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
9aa0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
9ab0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
9ac0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
9ad0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ae0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
9af0: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
9b00: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9b10: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9b20: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ;.  pInfo->nKey 
9b30: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9b40: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9b50: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9b60: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9b70: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9b80: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9b90: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9ba0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9bb0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9bc0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9bd0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9be0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9bf0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9c00: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9c10: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9c20: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9c30: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9c40: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9c50: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9c60: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9c70: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9c80: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9c90: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9ca0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9cb0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9cc0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9cd0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ce0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9cf0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9d00: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9d10: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9d20: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9d30: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9d40: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9d50: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
9d60: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9d70: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9d80: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9d90: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
9db0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
9dc0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
9dd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9de0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9df0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9e00: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67  ure */.){.  pPag
9e10: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
9e20: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
9e30: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
9e40: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  fo);.}../*.** Th
9e50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
9e60: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
9e70: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
9e80: 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a  MemPage.xCellSiz
9e90: 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  e.** method..**.
9ea0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
9eb0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
9ec0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
9ed0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
9ee0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
9ef0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
9f00: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
9f10: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
9f20: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
9f30: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
9f40: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
9f50: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
9f60: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
9f70: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
9f80: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
9f90: 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  ..**.** cellSize
9fa0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  PtrNoPayload()  
9fb0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74    =>   table int
9fc0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63  ernal nodes.** c
9fd0: 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20  ellSizePtr()    
9fe0: 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c           =>   al
9ff0: 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20  l index nodes & 
a000: 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73  table leaf nodes
a010: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
a020: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
a030: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
a040: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
a050: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61  er = pCell + pPa
a060: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a070: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
a080: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
a090: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
a0a0: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a0d0: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  or a varint */. 
a0e0: 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20   u32 nSize;     
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a110: 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  e value to retur
a120: 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  n */..#ifdef SQL
a130: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
a140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
a150: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a160: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
a170: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
a180: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
a190: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
a1a0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
a1b0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
a1c0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
a1d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
a1e0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
a1f0: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
a200: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
a210: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
a220: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
a230: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
a240: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
a250: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
a260: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a270: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a280: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
a290: 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20  #endif..  nSize 
a2a0: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
a2b0: 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20  nSize>=0x80 ){. 
a2c0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a2d0: 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26  [8];.    nSize &
a2e0: 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a  = 0x7f;.    do{.
a2f0: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e        nSize = (n
a300: 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  Size<<7) | (*++p
a310: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
a320: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
a330: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
a340: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
a350: 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70  pIter++;.  if( p
a360: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
a370: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
a380: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
a390: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
a3a0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
a3b0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
a3c0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
a3d0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
a3e0: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
a3f0: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
a400: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
a410: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
a420: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
a430: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a440: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
a450: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
a460: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
a470: 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65  ;.  }.  testcase
a480: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a490: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
a4a0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a4b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a4c0: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   );.  if( nSize<
a4d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a4e0: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d   ){.    nSize +=
a4f0: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
a500: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e  Cell);.    if( n
a510: 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d  Size<4 ) nSize =
a520: 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   4;.  }else{.   
a530: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
a540: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
a550: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
a560: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
a570: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
a580: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a590: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
a5a0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a5b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a5c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
a5d0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a5e0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
a5f0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
a600: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a610: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a620: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
a630: 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31  nSize += 4 + (u1
a640: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
a650: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a660: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
a670: 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  o.nSize || CORRU
a680: 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72  PT_DB );.  retur
a690: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
a6a0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
a6b0: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a6d0: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
a6e0: 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20   *pIter = pCell 
a6f0: 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  + 4; /* For loop
a700: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a710: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a720: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a730: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a740: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a750: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a760: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a770: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a780: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a790: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a7a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a7b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a7c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a7d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a7e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a7f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a800: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a810: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a820: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a830: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a840: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a850: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a860: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a870: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a880: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a890: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a8a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a8b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65  ebuginfo);.#else
a8c0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
a8d0: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
a8e0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
a8f0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a900: 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d  e==4 );.  pEnd =
a910: 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68   pIter + 9;.  wh
a920: 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26  ile( (*pIter++)&
a930: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a940: 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nd );.  assert( 
a950: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d  debuginfo.nSize=
a960: 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70  =(u16)(pIter - p
a970: 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54  Cell) || CORRUPT
a980: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a990: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a9a0: 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  ell);.}...#ifdef
a9b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
a9c0: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
a9d0: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
a9e0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
a9f0: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
aa00: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
aa10: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
aa20: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
aa30: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
aa40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
aa50: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
aa60: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
aa70: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
aa80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
aa90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
aaa0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
aab0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
aac0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
aad0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
aae0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
aaf0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
ab00: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
ab10: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
ab20: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
ab30: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
ab40: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
ab50: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
ab60: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
ab70: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
ab80: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
ab90: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
aba0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
abb0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
abc0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
abd0: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
abe0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
abf0: 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
ac00: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50  Payload ){.    P
ac10: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
ac20: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ac30: 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70  nSize-4]);.    p
ac40: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
ac50: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
ac60: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
ac70: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
ac80: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
ac90: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
aca0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
acb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6f  This routine reo
acc0: 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20 77  rganizes cells w
acd0: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ithin the.** pag
ace0: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
acf0: 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f 63  are no free-bloc
ad00: 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 62  ks on the free-b
ad10: 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  lock list..**.**
ad20: 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78 46   Parameter nMaxF
ad30: 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69 6d  rag is the maxim
ad40: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 61  um amount of fra
ad50: 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74 68  gmented space th
ad60: 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72 65  at may be.** pre
ad70: 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67 65  sent in the page
ad80: 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   after this rout
ad90: 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ine returns..**.
ada0: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
adb0: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
adc0: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
add0: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ade0: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
adf0: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
ae00: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
ae10: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
ae20: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
ae30: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ae40: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
ae50: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ae60: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ae70: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ae80: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ae90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
aea0: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
aeb0: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
aec0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
aed0: 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46 72  Page, int nMaxFr
aee0: 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ag){.  int i;   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
af10: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
af40: 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  the i-th cell */
af50: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
af60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af70: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
af80: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
af90: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
afa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
afb0: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
afc0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
afd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
afe0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
aff0: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
b000: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
b010: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
b020: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b030: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
b040: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
b050: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
b060: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
b070: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
b080: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
b090: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
b0a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b0b0: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
b0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
b0d0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
b0e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b0f0: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
b100: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
b110: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
b120: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
b130: 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ntent */.  unsig
b140: 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20  ned char *src;  
b150: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
b160: 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  of content */.  
b170: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
b180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
b190: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b1a0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
b1b0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
b1d0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
b1e0: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
b1f0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b200: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b210: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b220: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
b230: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
b240: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
b250: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
b260: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b270: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
b280: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
b290: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b2b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b2c0: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
b2d0: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
b2e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b2f0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
b300: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
b310: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
b320: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
b330: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
b340: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
b350: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
b360: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
b370: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
b380: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
b390: 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69  Cell;.  usableSi
b3a0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
b3b0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20  >usableSize;..  
b3c0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  /* This block ha
b3d0: 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74 68  ndles pages with
b3e0: 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66 72   two or fewer fr
b3f0: 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d  ee blocks and nM
b400: 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20 66  axFrag.  ** or f
b410: 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64 20  ewer fragmented 
b420: 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20 63  bytes. In this c
b430: 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65 72  ase it is faster
b440: 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20 2a   to move the.  *
b450: 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20 62  * two (or one) b
b460: 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20 75  locks of cells u
b470: 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20 61  sing memmove() a
b480: 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75 69  nd add the requi
b490: 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74 73  red.  ** offsets
b4a0: 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65 72   to each pointer
b4b0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
b4c0: 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e 20  nter array than 
b4d0: 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20 72  it is to .  ** r
b4e0: 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 65  econstruct the e
b4f0: 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f 0a  ntire page.  */.
b500: 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61 5b    if( (int)data[
b510: 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61 67  hdr+7]<=nMaxFrag
b520: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72 65   ){.    int iFre
b530: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
b540: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
b550: 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20 20  if( iFree ){.   
b560: 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d 20     int iFree2 = 
b570: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
b580: 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  Free]);..      /
b590: 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29  * pageFindSlot()
b5a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65 72   has already ver
b5b0: 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65 20  ified that free 
b5c0: 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74 65  blocks are sorte
b5d0: 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72  d.      ** in or
b5e0: 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77 69  der of offset wi
b5f0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20 61  thin the page, a
b600: 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63 6b  nd that no block
b610: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20 2a   extends.      *
b620: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
b630: 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f 76  f the page. Prov
b640: 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72 65  ided the two fre
b650: 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20 0a  e slots do not .
b660: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61 70        ** overlap
b670: 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65 65  , this guarantee
b680: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d 6f  s that the memmo
b690: 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f 77  ve() calls below
b6a0: 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 20   will not.      
b6b0: 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ** overwrite the
b6c0: 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74 65   usableSize byte
b6d0: 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69 66   buffer, even if
b6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
b6f0: 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 63  ge.      ** is c
b700: 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20 20  orrupt.  */.    
b710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32    assert( iFree2
b720: 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69 46  ==0 || iFree2>iF
b730: 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ree );.      ass
b740: 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32 62  ert( iFree+get2b
b750: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  yte(&data[iFree+
b760: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
b770: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b780: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
b790: 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65 28  iFree2+get2byte(
b7a0: 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29  &data[iFree2+2])
b7b0: 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29   <= usableSize )
b7c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
b7d0: 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61 5b  iFree2 || (data[
b7e0: 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64 61  iFree2]==0 && da
b7f0: 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30 29  ta[iFree2+1]==0)
b800: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
b810: 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c  pEnd = &data[cel
b820: 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
b830: 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  2];.        u8 *
b840: 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20 69  pAddr;.        i
b850: 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20 20  nt sz2 = 0;.    
b860: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65 74      int sz = get
b870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b880: 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e+2]);.        i
b890: 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  nt top = get2byt
b8a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b8b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
b8c0: 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ee2 ){.         
b8d0: 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 69 46   if( iFree+sz>iF
b8e0: 72 65 65 32 20 29 20 72 65 74 75 72 6e 20 53 51  ree2 ) return SQ
b8f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b900: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32  T;.          sz2
b910: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b920: 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20  a[iFree2+2]);.  
b930: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b940: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72  iFree+sz+sz2+iFr
b950: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c  ee2-(iFree+sz) <
b960: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  = usableSize );.
b970: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76            memmov
b980: 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a  e(&data[iFree+sz
b990: 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72  +sz2], &data[iFr
b9a0: 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28  ee+sz], iFree2-(
b9b0: 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20  iFree+sz));.    
b9c0: 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b        sz += sz2;
b9d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b9e0: 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a     cbrk = top+sz
b9f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ba00: 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f  ( cbrk+(iFree-to
ba10: 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65  p) <= usableSize
ba20: 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d   );.        memm
ba30: 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  ove(&data[cbrk],
ba40: 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72   &data[top], iFr
ba50: 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20  ee-top);.       
ba60: 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61   for(pAddr=&data
ba70: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41  [cellOffset]; pA
ba80: 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b  ddr<pEnd; pAddr+
ba90: 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  =2){.          p
baa0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
bab0: 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  dr);.          i
bac0: 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70  f( pc<iFree ){ p
bad0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70  ut2byte(pAddr, p
bae0: 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20  c+sz); }.       
baf0: 20 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69     else if( pc<i
bb00: 46 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74  Free2 ){ put2byt
bb10: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29  e(pAddr, pc+sz2)
bb20: 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ; }.        }.  
bb30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61        goto defra
bb40: 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20  gment_out;.     
bb50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
bb60: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
bb70: 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  e;.  iCellLast =
bb80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
bb90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
bba0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
bbb0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
bbc0: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
bbd0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
bbe0: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
bbf0: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
bc00: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
bc10: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
bc20: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc30: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
bc40: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bc50: 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54  Last );.    /* T
bc60: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
bc70: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
bc80: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
bc90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
bca0: 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63    ** if PRAGMA c
bcb0: 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f  ell_size_check=O
bcc0: 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  N..    */.    if
bcd0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
bce0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
bcf0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
bd00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bd10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
bd20: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
bd30: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
bd40: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
bd50: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
bd60: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
bd70: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
bd80: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
bd90: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
bda0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
bdb0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bdc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bdd0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bde0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
bdf0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
be00: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
be10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
be20: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
be30: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
be40: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
be50: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
be70: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
be80: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
be90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
bea0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
beb0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
bec0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
bed0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
bee0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
bef0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
bf00: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
bf10: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
bf20: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
bf30: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
bf40: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
bf50: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
bf60: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
bf70: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
bf80: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
bf90: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
bfa0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
bfb0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
bfc0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
bfd0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
bfe0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
bff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c000: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
c010: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
c020: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c030: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c040: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
c050: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
c060: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
c070: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   0;.  memset(&da
c080: 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20  ta[iCellFirst], 
c090: 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  0, cbrk-iCellFir
c0a0: 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  st);.  assert( s
c0b0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
c0c0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
c0d0: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
c0e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c0f0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
c100: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
c110: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
c120: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
c130: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
c140: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
c150: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
c160: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c170: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
c180: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
c190: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
c1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
c1b0: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
c1c0: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
c1d0: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
c1e0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
c1f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
c200: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
c210: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
c220: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
c230: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
c240: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
c250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c260: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
c270: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
c280: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
c290: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
c2a0: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
c2b0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
c2c0: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
c2d0: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
c2e0: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
c2f0: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
c300: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
c310: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
c320: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
c330: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
c340: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
c350: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
c360: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
c370: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
c380: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
c390: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
c3a0: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
c3b0: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
c3c0: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
c3d0: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
c3e0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
c3f0: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
c400: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
c410: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
c420: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
c430: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
c440: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
c450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c460: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
c470: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
c480: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
c490: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
c4a0: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
c4b0: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
c4c0: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
c4d0: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
c4e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
c4f0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
c500: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
c510: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
c520: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c530: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
c540: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
c550: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
c560: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
c570: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
c580: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
c590: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
c5a0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
c5b0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c5c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
c5d0: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
c5e0: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
c5f0: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
c600: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
c610: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
c620: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c630: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
c640: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
c650: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
c660: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
c670: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
c680: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
c690: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
c6a0: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
c6b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
c6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
c6d0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
c6e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
c6f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c700: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
c710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
c720: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
c730: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
c740: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
c750: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
c760: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
c770: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
c780: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
c790: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
c7a0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
c7b0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
c7c0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
c7d0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
c7e0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c7f0: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
c800: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
c810: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
c820: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
c830: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
c840: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
c850: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
c860: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
c870: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
c880: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
c890: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
c8a0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
c8b0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
c8c0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
c8d0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
c8e0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
c8f0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
c900: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
c910: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
c920: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
c930: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
c940: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
c950: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
c960: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
c970: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
c980: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
c990: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
c9a0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
c9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
c9c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
c9d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
c9e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
c9f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
ca00: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
ca10: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
ca20: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
ca30: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
ca40: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
ca50: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
ca60: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
ca70: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
ca80: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
ca90: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
caa0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
cab0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
cac0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
cad0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
cae0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
caf0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
cb00: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
cb10: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
cb20: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
cb30: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
cb40: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
cb50: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
cb60: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
cb70: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
cb80: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
cb90: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
cba0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
cbb0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
cbc0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
cbd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
cbe0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
cbf0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
cc00: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
cc10: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
cc20: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
cc30: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
cc40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
cc50: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
cc60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
cc70: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
cc80: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc90: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
cca0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
ccb0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ccc0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
ccd0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
cce0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ccf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
cd00: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
cd10: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
cd20: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd40: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
cd50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cd60: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
cd70: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cd90: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
cda0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cdc0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
cdd0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
cde0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
cdf0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
ce00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ce10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ce20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ce30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ce40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
ce50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ce60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ce70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
ce80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
ce90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
cea0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
ceb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cec0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
ced0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cee0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
cef0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
cf00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
cf10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
cf20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
cf30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
cf40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
cf50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
cf60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
cf70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
cf80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
cf90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
cfa0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
cfb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
cfc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
cfd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
cfe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
cff0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d000: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d010: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d020: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d030: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d040: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d050: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d060: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d070: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d080: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d090: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d0a0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d0b0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d0c0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
d0d0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
d0e0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
d0f0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
d100: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
d110: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d120: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
d130: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d140: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
d150: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
d160: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
d170: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
d180: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
d190: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
d1a0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
d1b0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
d1c0: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
d1d0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
d1e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d1f0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
d200: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
d210: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
d220: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
d230: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
d240: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
d250: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
d260: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
d270: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
d280: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
d290: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
d2a0: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
d2b0: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
d2c0: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
d2d0: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
d2e0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
d2f0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
d300: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
d310: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d320: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
d330: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
d340: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
d350: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
d360: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
d370: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
d380: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
d390: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
d3a0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
d3b0: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
d3c0: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
d3d0: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
d3e0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
d3f0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
d400: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
d410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d420: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
d430: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
d440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d450: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
d460: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
d470: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
d480: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
d490: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
d4a0: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
d4b0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
d4c0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
d4d0: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
d4e0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
d4f0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
d500: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d510: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
d520: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
d530: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
d540: 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70  (pPage, MIN(4, p
d550: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32  Page->nFree - (2
d560: 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69  +nByte)));.    i
d570: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
d580: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
d590: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
d5a0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
d5b0: 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42  assert( gap+2+nB
d5c0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
d5d0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
d5e0: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
d5f0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
d600: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
d610: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
d620: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d630: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
d640: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
d650: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
d660: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
d670: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
d680: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
d690: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
d6a0: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
d6b0: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
d6c0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
d6d0: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
d6e0: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
d6f0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
d700: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
d710: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
d720: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
d730: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
d740: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
d750: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
d760: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
d770: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
d780: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
d790: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
d7a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d7b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d7c0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
d7d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
d7e0: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
d7f0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
d800: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
d810: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
d820: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
d830: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
d840: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
d850: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
d860: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
d870: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
d880: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
d890: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
d8a0: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
d8b0: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
d8c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d8d0: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
d8e0: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
d8f0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
d900: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
d910: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
d920: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
d930: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
d940: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d950: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d960: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d970: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d980: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d990: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d9a0: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d9b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d9c0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d9d0: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d9e0: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d9f0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
da00: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
da10: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
da20: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
da30: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
da60: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
da70: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
da80: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
da90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
daa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
dab0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
dac0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
dad0: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
db00: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
db10: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
db20: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
db50: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
db60: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
db70: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
db80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
db90: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
dba0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
dbb0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
dbc0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
dbd0: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
dbe0: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
dbf0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
dc00: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
dc10: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
dc20: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
dc30: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
dc40: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
dc50: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
dc60: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
dc70: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
dc80: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
dc90: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
dca0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dcb0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
dcc0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
dcd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
dce0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
dcf0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
dd00: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
dd10: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
dd20: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
dd30: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
dd40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
dd50: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
dd60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dd70: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
dd80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
dd90: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
dda0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
ddb0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
ddc0: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
ddd0: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
dde0: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
ddf0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
de00: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
de10: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
de20: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
de30: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
de40: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
de50: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
de60: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
de70: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
de80: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
de90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
dea0: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
deb0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
dec0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
ded0: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
dee0: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
def0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
df00: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
df10: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
df20: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
df30: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
df40: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
df50: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
df60: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
df70: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
df80: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
df90: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
dfa0: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
dfb0: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
dfc0: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
dfd0: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
dfe0: 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61  ata[iPtr]))<iSta
dff0: 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rt ){.      if( 
e000: 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20  iFreeBlk<iPtr+4 
e010: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
e020: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65  FreeBlk==0 ) bre
e030: 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ak;.        retu
e040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
e060: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e070: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e080: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
e090: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
e0a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e0b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
e0c0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
e0d0: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
e0e0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
e0f0: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
e100: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
e110: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
e120: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
e130: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
e140: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
e150: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
e160: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
e170: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
e180: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
e190: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
e1a0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
e1b0: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e1c0: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
e1d0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e1e0: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
e1f0: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
e200: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
e210: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
e220: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e250: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
e260: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
e270: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
e280: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
e290: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
e2a0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
e2b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e2c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
e2d0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
e2e0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
e2f0: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e300: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
e310: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e320: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
e330: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
e340: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
e350: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
e360: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
e370: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
e380: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
e390: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
e3a0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
e3b0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
e3c0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
e3d0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
e3e0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
e3f0: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
e400: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
e410: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
e420: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e430: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
e440: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e450: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
e460: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e470: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
e480: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
e490: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
e4a0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
e4b0: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
e4c0: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
e4d0: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
e4e0: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
e4f0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
e500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e510: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
e520: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
e530: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
e540: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
e550: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
e560: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
e570: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
e580: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e590: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e5a0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
e5b0: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
e5c0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
e5d0: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
e5e0: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
e5f0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
e600: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
e610: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
e620: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e630: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
e640: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e650: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
e660: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e670: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
e680: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e690: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
e6a0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
e6b0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
e6c0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
e6d0: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
e6e0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
e6f0: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
e700: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
e710: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e720: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
e730: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
e740: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
e750: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e760: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
e770: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
e780: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
e790: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
e7a0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
e7b0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
e7c0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
e7d0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
e7e0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
e7f0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
e800: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
e810: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
e820: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
e830: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
e840: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
e850: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
e860: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
e870: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
e880: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
e890: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
e8a0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e8b0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e8c0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e8d0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e8e0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e8f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e900: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e910: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e920: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
e930: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
e940: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
e950: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
e960: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
e970: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
e980: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
e990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e9a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e9b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e9c0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
e9d0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
e9e0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
e9f0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
ea00: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
ea10: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
ea20: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
ea30: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
ea40: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
ea50: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
ea60: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
ea70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
ea80: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
ea90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
eaa0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
eab0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
eac0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
ead0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
eae0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
eaf0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
eb00: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
eb10: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
eb20: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
eb30: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
eb40: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
eb50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
eb60: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
eb70: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
eb80: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
eb90: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
eba0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
ebb0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ebc0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
ebd0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
ebe0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
ebf0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
ec00: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
ec10: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
ec20: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
ec30: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
ec40: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
ec50: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
ec60: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
ec70: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
ec80: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
ec90: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
eca0: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
ecb0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
ecc0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ecd0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
ece0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
ecf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
ed00: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
ed10: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
ed20: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
ed30: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
ed40: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
ed50: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
ed60: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
ed70: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
ed80: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
ed90: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
eda0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
edb0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
edc0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
edd0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
ede0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
edf0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
ee00: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
ee10: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
ee20: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
ee30: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
ee40: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
ee50: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
ee60: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ee70: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
ee80: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
ee90: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
eea0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
eeb0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
eec0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
eed0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
eee0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
eef0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
ef00: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
ef10: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
ef20: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
ef30: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ef40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ef50: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ef60: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ef70: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ef80: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ef90: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
efa0: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
efb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
efc0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
efd0: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
efe0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
eff0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
f000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f010: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
f020: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
f030: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
f040: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
f050: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
f060: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
f070: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
f080: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
f090: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
f0a0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
f0b0: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
f0c0: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
f0d0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
f0e0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
f0f0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
f100: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
f110: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
f120: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
f130: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
f140: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
f150: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
f160: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
f170: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
f180: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
f190: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
f1a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
f1b0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
f1c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
f1d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
f1e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
f1f0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
f200: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f210: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
f220: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
f230: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
f240: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
f250: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
f260: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
f270: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f280: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f290: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
f2a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
f2b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
f2c0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
f2d0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
f2e0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
f2f0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
f300: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
f310: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
f320: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
f330: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
f340: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
f350: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
f360: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
f370: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
f380: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
f390: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
f3a0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
f3b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
f3c0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
f3d0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
f3e0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
f3f0: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
f400: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
f410: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
f420: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
f430: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
f440: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
f450: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
f460: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
f470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f480: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
f490: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
f4a0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
f4b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
f4c0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
f4d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f4e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
f4f0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
f500: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
f510: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
f520: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
f530: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
f540: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
f550: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
f560: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
f570: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
f580: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
f590: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
f5a0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
f5b0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
f5c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f5d0: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
f5e0: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
f5f0: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
f600: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
f610: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
f620: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
f630: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
f640: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
f650: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f660: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
f670: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
f680: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
f690: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
f6a0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
f6b0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
f6c0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
f6d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
f6e0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
f6f0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
f700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
f710: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
f720: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
f730: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
f740: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f750: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
f760: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
f770: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
f780: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
f790: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
f7a0: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
f7b0: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
f7c0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
f7d0: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
f7e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
f7f0: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
f800: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f810: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
f820: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
f830: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
f840: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
f850: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
f860: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
f870: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
f880: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
f890: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
f8a0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
f8b0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
f8c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f8d0: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
f8e0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
f8f0: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
f900: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
f910: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
f920: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
f930: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
f940: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f950: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
f960: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
f970: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
f980: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f990: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f9a0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f9b0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f9c0: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f9d0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f9e0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f9f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
fa00: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
fa10: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
fa20: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
fa30: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
fa40: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
fa50: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
fa60: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
fa70: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
fa80: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
fa90: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
faa0: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
fab0: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
fac0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
fad0: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
fae0: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
faf0: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
fb00: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
fb10: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
fb20: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fb30: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
fb40: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
fb50: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
fb60: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
fb70: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
fb80: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
fb90: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
fba0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
fbb0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
fbc0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
fbd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
fbe0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
fbf0: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
fc00: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
fc10: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
fc20: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
fc30: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
fc40: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
fc50: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
fc60: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
fc70: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
fc80: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
fc90: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
fca0: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
fcb0: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
fcc0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
fcd0: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
fce0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
fcf0: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
fd00: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
fd10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fd20: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
fd30: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
fd40: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
fd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
fd60: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
fd70: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
fd80: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
fd90: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
fda0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
fdb0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
fdc0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
fdd0: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
fde0: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
fdf0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
fe00: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
fe10: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
fe20: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
fe30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
fe40: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
fe50: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
fe60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fe70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fe80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
fe90: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
fea0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
feb0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
fec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
fed0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
fee0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
fef0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
ff00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
ff10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ff20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ff30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ff40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
ff50: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
ff60: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
ff70: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ff80: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
ff90: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
ffa0: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
ffb0: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
ffc0: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
ffd0: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
ffe0: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
fff0: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
10000 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10010 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
10020 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
10030 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
10040 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
10050 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
10060 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
10070 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
10080 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
10090 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
100a0 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
100b0 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
100c0 20 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20     if( pc>0 ){. 
100d0 20 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73       u32 next, s
100e0 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
100f0 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  c<iCellFirst ){.
10100 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
10110 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
10120 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
10130 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
10140 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
10150 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
10160 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
10170 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10180 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10190 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
101a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
101b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
101c0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20   .      }.      
101d0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
101e0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
101f0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
10200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 2f 2a  CORRUPT_BKPT; /*
10220 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74   Freeblock off t
10230 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
10240 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ge */.        }.
10250 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67          next = g
10260 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10270 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 69 7a 65  ]);.        size
10280 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10290 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
102a0 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
102b0 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  + size;.        
102c0 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
102d0 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
102e0 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10300 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ( next>0 ){.    
10310 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10320 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
10330 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f   /* Freeblock no
10340 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
10350 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  rder */.      }.
10360 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a        if( pc+siz
10370 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10380 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
103a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
103b0 3b 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62  ;  /* Last freeb
103c0 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73  lock extends pas
103d0 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20  t page end */.  
103e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
103f0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
10400 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
10410 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
10420 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
10430 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
10440 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
10450 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
10460 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
10470 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
10480 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10490 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
104a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
104b0 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
104c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
104d0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
104e0 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
104f0 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
10500 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
10510 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
10520 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
10530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10540 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
10550 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
10560 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
10570 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
10580 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
10590 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
105a0 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
105b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
105c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
105d0 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
105e0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
105f0 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
10600 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
10610 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
10620 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10630 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10640 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10650 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10660 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10670 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10680 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10690 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
106a0 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
106b0 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
106c0 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
106d0 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
106e0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
106f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10700 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10710 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10720 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10740 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10750 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10760 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10780 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
10790 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
107a0 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
107b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
107c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
107d0 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
107e0 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
107f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10800 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
10810 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10830 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10840 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10850 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
10860 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
10870 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
10880 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
10890 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
108a0 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
108b0 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
108c0 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
108d0 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
108e0 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
108f0 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
10900 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
10910 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
10920 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
10930 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
10940 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
10950 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
10960 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
10970 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
10980 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
10990 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
109a0 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
109b0 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
109c0 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
109d0 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
109e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
109f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
10a00 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
10a10 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f  .  pPage->aDataO
10a20 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67  fst = &data[pPag
10a30 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
10a40 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
10a50 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
10a60 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
10a70 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
10a80 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
10a90 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
10aa0 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
10ab0 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
10ac0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
10ad0 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
10ae0 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
10af0 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
10b00 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
10b10 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
10b20 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
10b30 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
10b40 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
10b50 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
10b60 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
10b70 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
10b80 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
10b90 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
10ba0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
10bb0 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
10bc0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
10bd0 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  age);.  if( pgno
10be0 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b  !=pPage->pgno ){
10bf0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
10c00 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
10c10 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10c20 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62  ;.    pPage->pDb
10c30 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
10c40 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d      pPage->pBt =
10c50 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d   pBt;.    pPage-
10c60 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
10c70 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
10c80 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
10c90 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73  00 : 0;.  }.  as
10ca0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
10cb0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
10cc0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10cd0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
10ce0 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
10cf0 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10d00 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
10d10 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10d20 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10d30 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10d40 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53  ts if needed.  S
10d50 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65  ee also: btreeGe
10d60 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a  tUnusedPage()..*
10d70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45  *.** If the PAGE
10d80 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
10d90 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
10da0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
10db0 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f   not care.** abo
10dc0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ut the content o
10dd0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
10de0 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
10df0 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
10e00 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
10e10 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
10e20 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
10e30 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
10e40 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
10e50 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
10e60 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
10e70 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
10e80 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
10e90 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
10ea0 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
10eb0 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
10ec0 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
10ed0 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
10ee0 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
10ef0 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
10f00 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
10f10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10f20 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
10f30 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
10f40 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
10f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10f60 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
10f70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
10f80 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
10f90 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
10fa0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
10fb0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
10fc0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
10fd0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
10fe0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
10ff0 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
11000 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
11010 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
11020 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
11030 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
11040 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
11050 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
11060 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
11070 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11080 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11090 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
110a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
110b0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
110c0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
110d0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
110e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
110f0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
11100 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11110 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11120 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
11130 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11140 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
11150 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
11160 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
11170 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
11180 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
11190 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
111a0 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
111b0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
111c0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
111d0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
111e0 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
111f0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
11200 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
11210 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
11220 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
11230 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
11240 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11250 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11260 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11270 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
11280 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
11290 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
112a0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
112b0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
112c0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
112d0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
112e0 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
112f0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
11300 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
11310 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11320 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
11330 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
11340 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
11350 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
11360 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
11370 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
11380 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
11390 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
113a0 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
113b0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
113c0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
113d0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
113e0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
113f0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
11400 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
11410 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
11420 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
11430 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
11440 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
11450 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
11460 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
11470 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
11480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
11490 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
114a0 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
114b0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
114c0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
114d0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
114e0 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
114f0 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
11500 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
11510 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
11520 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
11530 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
11540 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
11550 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
11560 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
11570 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
11580 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
11590 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
115a0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
115b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
115c0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
115d0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
115e0 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
115f0 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
11600 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
11610 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
11620 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
11630 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
11640 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
11650 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
11660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
11670 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
11680 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
116b0 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
116c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
116d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
116e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
116f0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
11700 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
11710 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
11720 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
11730 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
11740 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
11750 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
11760 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
11770 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
11780 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
11790 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
117a0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
117b0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
117c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
117d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
117e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
117f0 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
11800 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
11810 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
11820 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11830 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
11840 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
11850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11860 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
11870 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
11880 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
11890 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
118a0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
118b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
118c0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
118d0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
118e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
118f0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
11900 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
11910 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
11920 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
11930 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
11940 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11950 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
11960 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
11970 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11980 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
11990 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
119a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
119b0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119c0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119d0 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
119e0 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
119f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11a20 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11a30 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11a40 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
11a50 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
11a60 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
11a70 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
11a80 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
11a90 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
11aa0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
11ab0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
11ac0 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
11ad0 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
11ae0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
11af0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
11b00 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
11b10 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
11b20 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
11b30 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
11b40 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
11b50 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
11b60 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
11b70 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
11b80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11b90 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  PT;.    releaseP
11ba0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11bb0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11bc0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11be0 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74  _OK;..getAndInit
11bf0 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66  Page_error:.  if
11c00 28 20 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69  ( pCur ) pCur->i
11c10 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61  Page--;.  testca
11c20 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
11c30 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
11c40 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
11c50 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
11c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11c70 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
11c80 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
11c90 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
11ca0 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
11cb0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
11cc0 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
11cd0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11ce0 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
11cf0 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
11d00 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
11d20 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
11d30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
11d40 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
11d50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11d60 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11d70 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11d80 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11d90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11da0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11db0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
11dc0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
11dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11de0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
11df0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
11e10 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
11e20 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
11e30 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
11e40 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
11e50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
11e60 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
11e70 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
11e80 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
11e90 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
11ea0 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
11eb0 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
11ec0 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
11ed0 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
11ee0 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
11ef0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
11f00 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
11f10 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
11f20 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
11f30 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
11f40 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
11f50 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
11f60 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
11f70 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
11f80 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
11f90 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
11fa0 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
11fb0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11fc0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
11fd0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
11fe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11ff0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12000 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
12010 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
12020 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
12030 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12040 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
12050 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12060 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12070 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12080 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12090 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
120a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
120b0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
120c0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
120f0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
12100 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
12110 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
12120 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
12130 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
12140 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
12150 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12160 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12170 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12180 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12190 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
121a0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
121b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
121c0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
121d0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
121e0 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
121f0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
12200 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
12210 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
12220 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
12230 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
12240 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
12250 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12260 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12270 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12280 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12290 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
122a0 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
122b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
122c0 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
122d0 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
122e0 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
122f0 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
12300 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12310 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
12320 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
12330 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
12340 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
12350 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12360 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12380 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12390 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
123a0 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
123b0 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
123c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
123d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
123e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
123f0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
12400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12410 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12420 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
12430 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
12440 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
12450 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12460 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12470 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12480 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12490 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
124a0 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
124b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
124c0 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
124d0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
124e0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
124f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
12500 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
12510 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
12520 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
12530 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
12540 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
12550 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12560 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12570 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12580 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12590 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
125a0 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
125b0 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
125c0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
125d0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
125e0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
125f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
12600 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
12610 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
12620 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
12630 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12640 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
12650 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12660 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12670 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12680 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12690 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126a0 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
126b0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
126c0 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
126d0 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
126e0 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
12700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
12710 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
12720 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
12730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12740 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
12750 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65  e is NULL.** the
12760 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64  n an ephemeral d
12770 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
12780 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72  ed.  The ephemer
12790 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68  al database migh
127a0 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76  t.** be exclusiv
127b0 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f  ely in memory, o
127c0 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61  r it might use a
127d0 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f   disk-based memo
127e0 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74  ry cache..** Eit
127f0 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68  her way, the eph
12800 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20  emeral database 
12810 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
12820 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a  cally deleted .*
12830 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74  * when sqlite3Bt
12840 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61  reeClose() is ca
12850 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  lled..**.** If z
12860 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
12870 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69  mory:" then an i
12880 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12890 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
128a0 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69  that is automati
128b0 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20  cally destroyed 
128c0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
128d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c  d..**.** The "fl
128e0 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69  ags" parameter i
128f0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74  s a bitmask that
12900 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62   might contain b
12910 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45  its like.** BTRE
12920 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  E_OMIT_JOURNAL a
12930 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f  nd/or BTREE_MEMO
12940 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  RY..**.** If the
12950 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
12960 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
12970 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
12980 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
12990 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
129a0 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
129b0 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
129c0 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
129d0 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
129e0 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
129f0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
12a00 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
12a10 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
12a20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
12a30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
12a40 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
12a50 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
12a60 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
12a70 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12a80 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71  3BtreeOpen(.  sq
12a90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12aa0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
12ab0 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74  use for this b-t
12ac0 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ree */.  const c
12ad0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
12ae0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
12af0 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
12b00 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
12b10 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
12b20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12b30 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
12b40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
12b50 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
12b60 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
12b70 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
12b80 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
12b90 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
12ba0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
12bb0 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
12bc0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12be0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12bf0 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
12c00 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
12c10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12c20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12c30 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74    /* Shared part
12c40 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74   of btree struct
12c50 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  ure */.  Btree *
12c60 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
12c70 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
12c80 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
12c90 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
12ca0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20  mutexOpen = 0;  
12cb0 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61  /* Prevents a ra
12cc0 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69  ce condition. Ti
12cd0 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20  cket #3537 */.  
12ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12cf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
12d00 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
12d10 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
12d20 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76   */.  u8 nReserv
12d30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12d40 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20       /* Byte of 
12d50 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20  unused space on 
12d60 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
12d70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62  nsigned char zDb
12d80 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a  Header[100];  /*
12d90 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
12da0 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f   content */..  /
12db0 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e  * True if openin
12dc0 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20  g an ephemeral, 
12dd0 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12de0 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  se */.  const in
12df0 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69  t isTempDb = zFi
12e00 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
12e10 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20  lename[0]==0;.. 
12e20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
12e30 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
12e40 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
12e50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
12e60 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
12e70 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
12e80 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23  database..  */.#
12e90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
12ea0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e  T_MEMORYDB.  con
12eb0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
12ec0 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73   0;.#else.  cons
12ed0 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
12ee0 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74  (zFilename && st
12ef0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
12f00 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a  ":memory:")==0).
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d         || (isTem
12f30 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65  pDb && sqlite3Te
12f40 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a  mpInMemory(db)).
12f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f60 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c         || (vfsFl
12f70 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12f80 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65  N_MEMORY)!=0;.#e
12f90 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
12fa0 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
12fb0 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20  t( pVfs!=0 );.  
12fc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12fd0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12fe0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
12ff0 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d  t( (flags&0xff)=
13000 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66  =flags );   /* f
13010 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69  lags fit in 8 bi
13020 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  ts */..  /* Only
13030 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   a BTREE_SINGLE 
13040 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
13050 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20  BTREE_UNORDERED 
13060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13070 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52  ags & BTREE_UNOR
13080 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c  DERED)==0 || (fl
13090 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
130a0 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  LE)!=0 );..  /* 
130b0 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  A BTREE_SINGLE d
130c0 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79  atabase is alway
130d0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  s a temporary an
130e0 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a  d/or ephemeral *
130f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
13100 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
13110 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44  E)==0 || isTempD
13120 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65  b );..  if( isMe
13130 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  mdb ){.    flags
13140 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59   |= BTREE_MEMORY
13150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73  ;.  }.  if( (vfs
13160 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13170 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20  PEN_MAIN_DB)!=0 
13180 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69  && (isMemdb || i
13190 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20  sTempDb) ){.    
131a0 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46  vfsFlags = (vfsF
131b0 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f  lags & ~SQLITE_O
131c0 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53  PEN_MAIN_DB) | S
131d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
131e0 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71  DB;.  }.  p = sq
131f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13200 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
13210 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
13220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
13230 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13240 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13250 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
13260 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
13270 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13280 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
13290 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
132a0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
132b0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
132c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
132d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
132e0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
132f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13300 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
13310 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
13320 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
13330 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
13340 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
13350 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
13360 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
13370 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
13380 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
13390 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
133a0 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
133b0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
133c0 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
133d0 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
133e0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
133f0 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
13400 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
13410 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13420 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
13430 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
13440 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
13450 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
13460 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
13470 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
13480 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
13490 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
134a0 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
134b0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
134c0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
134d0 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
134e0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
134f0 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
13500 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
13510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
13520 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13530 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13540 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
13550 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13560 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
13570 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
13580 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
13590 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
135a0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
135b0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
135c0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
135d0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
13600 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
13610 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
13630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13640 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13650 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13660 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13670 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
13680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13690 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
136a0 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
136b0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
136c0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
136d0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
136e0 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
136f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13700 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
13710 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
13720 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13730 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13740 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
13750 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13760 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13770 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
13780 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
13790 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
137a0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
137b0 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
137c0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
137d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
137e0 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
137f0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
13800 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
13810 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
13820 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
13830 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
13840 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
13850 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
13860 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
13870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
13880 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
13890 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
138a0 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
138b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
138c0 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
138d0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
138e0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
138f0 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
13900 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
13910 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
13920 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13930 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
13940 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
13950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13960 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
13970 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
13980 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13990 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
139a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
139b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
139c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
139d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
139e0 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
139f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13a00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13a10 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13a20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13a50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13a60 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13a70 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13a80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13a90 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13aa0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
13ab0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
13ac0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
13ad0 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
13ae0 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
13af0 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
13b00 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13b10 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13b20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13b30 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13b40 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13b50 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13b60 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13b70 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13b90 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13ba0 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
13bb0 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
13bc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
13bd0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13be0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
13bf0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
13c00 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13c10 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13c20 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13c30 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13c40 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13c50 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13c60 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13c70 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13c80 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13c90 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13ca0 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
13cb0 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
13cc0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
13cd0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
13ce0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13cf0 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
13d00 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13d10 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13d20 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13d30 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13d40 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13d50 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13d60 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13d70 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13d80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13d90 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13da0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
13db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
13dc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
13dd0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13de0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13df0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
13e00 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
13e10 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
13e20 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e40 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
13e50 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c  MemPage), flags,
13e60 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
13e70 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
13e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13ea0 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
13eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
13ec0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
13ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13ee0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
13ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
13f00 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
13f10 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
13f20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
13f40 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13f50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
13f60 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
13f70 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
13f80 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
13f90 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
13fa0 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
13fb0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
13fc0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
13fd0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
13fe0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
13ff0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
14000 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
14010 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
14020 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
14030 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
14040 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
14050 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
14060 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
14070 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
14080 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14090 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
140a0 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
140b0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
140c0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
140d0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
140e0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
140f0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
14100 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
14110 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
14120 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
14130 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
14140 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
14150 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
14160 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14170 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  /.    pBt->pageS
14180 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72  ize = (zDbHeader
14190 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48  [16]<<8) | (zDbH
141a0 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a  eader[17]<<16);.
141b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
141c0 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
141d0 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
141e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
141f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
14200 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
14210 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
14220 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
14230 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66  ageSize = 0;.#if
14240 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14250 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
14260 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69    /* If the magi
14270 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a  c name ":memory:
14280 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e  " will create an
14290 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
142a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ase, then.      
142b0 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74  ** leave the aut
142c0 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20  oVacuum mode at 
142d0 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76  0 (do not auto-v
142e0 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a  acuum), even if.
142f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
14300 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
14310 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74  UM is true. On t
14320 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
14330 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
14340 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
14350 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64  has been defined
14360 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a  , then ":memory:
14370 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20  " is just a.    
14380 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c    ** regular fil
14390 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e-name. In this 
143a0 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61  case the auto-va
143b0 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20  cuum applies as 
143c0 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20  per normal..    
143d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a    */.      if( z
143e0 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d  Filename && !isM
143f0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
14400 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
14410 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14420 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31  T_AUTOVACUUM ? 1
14430 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70   : 0);.        p
14440 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
14450 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
14460 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f  _AUTOVACUUM==2 ?
14470 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d   1 : 0);.      }
14480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52  .#endif.      nR
14490 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20  eserve = 0;.    
144a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
144b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
144c0 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
144d0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
144e0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
144f0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
14500 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
14510 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
14520 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
14530 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
14540 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61    ** into the da
14550 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
14560 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65  er. */.      nRe
14570 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65  serve = zDbHeade
14580 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[20];.      pBt
14590 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
145a0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
145b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
145c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
145d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  .      pBt->auto
145e0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
145f0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
14600 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
14610 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
14620 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
14630 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
14640 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
14650 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  dif.    }.    rc
14660 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14670 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14680 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14690 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
146a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
146b0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
146c0 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  out;.    pBt->us
146d0 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
146e0 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65  pageSize - nRese
146f0 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
14700 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20   (pBt->pageSize 
14710 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38  & 7)==0 );  /* 8
14720 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
14730 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20  of pageSize */. 
14740 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
14750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14760 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14770 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14780 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
14790 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
147a0 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
147b0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
147c0 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
147d0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ds..    */.    p
147e0 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
147f0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
14800 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58  e ){.      MUTEX
14810 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
14820 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
14830 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45  ed; ).      MUTE
14840 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
14850 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
14860 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14870 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
14880 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
14890 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
148a0 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
148b0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
148c0 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
148d0 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
148e0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
148f0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
14900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
14910 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
14920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
14950 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14970 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
14980 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14990 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
149a0 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
149b0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149c0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
149d0 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
149e0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
149f0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
14a00 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
14a10 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a20 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14a30 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
14a40 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
14a50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14a60 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
14a70 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
14a80 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
14a90 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
14aa0 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
14ab0 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
14ac0 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
14ad0 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
14ae0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
14af0 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
14b00 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
14b10 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
14b20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
14b30 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
14b40 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
14b50 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
14b60 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
14b70 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
14b80 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
14b90 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
14ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
14bb0 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
14bc0 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
14bd0 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
14be0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
14bf0 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
14c00 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
14c10 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
14c20 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28  ( (uptr)p->pBt<(
14c30 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29  uptr)pSib->pBt )
14c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14c50 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14c60 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14c70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14c80 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14c90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14ca0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14cb0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28  pSib->pNext && (
14cc0 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74  uptr)pSib->pNext
14cd0 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70  ->pBt<(uptr)p->p
14ce0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14cf0 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
14d00 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
14d10 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
14d20 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
14d30 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
14d40 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
14d50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
14d60 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
14d70 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
14d80 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14da0 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
14db0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14dd0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
14de0 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
14df0 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
14e00 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
14e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
14e20 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
14e30 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
14e40 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
14e50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14e70 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14e80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14e90 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14ea0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14eb0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
14ec0 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  *pFile;..    /* 
14ed0 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
14ee0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
14ef0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
14f00 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
14f10 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
14f20 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
14f30 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
14f40 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
14f50 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
14f60 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
14f70 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
14f80 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
14f90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
14fa0 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
14fb0 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
14fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14fd0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
14fe0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
14ff0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
15000 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
15010 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73  }..    pFile = s
15020 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
15030 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
15040 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65    if( pFile->pMe
15050 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73  thods ){.      s
15060 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
15070 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53  rolHint(pFile, S
15080 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c  QLITE_FCNTL_PDB,
15090 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62   (void*)&pBt->db
150a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
150b0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
150c0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
150d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
150e0 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
150f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15100 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
15110 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
15120 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
15130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e  sqlite3BtreeConn
15140 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42  ectionCount(*ppB
15150 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74  tree)>0 );.  ret
15160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15170 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
15180 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
15190 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
151a0 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
151b0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
151c0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
151d0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
151e0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
151f0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
15200 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
15210 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
15220 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
15230 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
15240 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
15250 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
15260 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15270 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15290 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
152a0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
152b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
152c0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
152d0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
152e0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
152f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15300 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
15310 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15320 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
15330 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
15340 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15350 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15360 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
15370 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15380 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
15390 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
153a0 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
153b0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
153c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
153d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
153e0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
153f0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15400 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15410 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
15420 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
15430 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
15440 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
15450 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
15460 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
15470 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
15480 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
15490 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
154a0 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
154b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
154c0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
154d0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
154e0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
154f0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
15500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
15510 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
15520 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
15530 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
15540 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
15550 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
15560 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
15570 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
15580 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
15590 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
155a0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
155b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
155c0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
155d0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
155e0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
155f0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
15600 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74  E(pBt) bytes wit
15610 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69  h a 4-byte prefi
15620 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69  x for a left-chi
15630 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a  ld.** pointer..*
15640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c  /.static void al
15650 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
15660 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15670 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70    if( !pBt->pTmp
15680 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74  Space ){.    pBt
15690 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
156a0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
156b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29   pBt->pageSize )
156c0 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ;..    /* One of
156d0 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74   the uses of pBt
156e0 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74  ->pTmpSpace is t
156f0 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62  o format cells b
15700 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  efore.    ** ins
15710 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f  erting them into
15720 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75   a leaf page (fu
15730 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c  nction fillInCel
15740 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20  l()). If.    ** 
15750 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74  a cell is less t
15760 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73  han 4 bytes in s
15770 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64  ize, it is round
15780 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73  ed up to 4 bytes
15790 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76  .    ** by the v
157a0 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20  arious routines 
157b0 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20  that manipulate 
157c0 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68  binary cells. Wh
157d0 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d  ich.    ** can m
157e0 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43  ean that fillInC
157f0 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69  ell() only initi
15800 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74  alizes the first
15810 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62   2 or 3.    ** b
15820 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63  ytes of pTmpSpac
15830 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20  e, but that the 
15840 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72  first 4 bytes ar
15850 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20  e copied from.  
15860 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64    ** it into a d
15870 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68  atabase page. Th
15880 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c  is is not actual
15890 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75  ly a problem, bu
158a0 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73  t it.    ** does
158b0 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e   cause a valgrin
158c0 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65  d error when the
158d0 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66   1 or 2 bytes of
158e0 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20   unitialized .  
158f0 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73    ** data is pas
15900 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61  sed to system ca
15910 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74  ll write(). So t
15920 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72  o avoid this err
15930 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20  or,.    ** zero 
15940 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15950 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20  s of temp space 
15960 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  here..    **.   
15970 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69   ** Also:  Provi
15980 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  de four bytes of
15990 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61   initialized spa
159a0 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20  ce before the.  
159b0 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f    ** beginning o
159c0 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61  f pTmpSpace as a
159d0 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65  n area available
159e0 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a   to prepend the.
159f0 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c      ** left-chil
15a00 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
15a10 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
15a20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cell..    */.   
15a30 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
15a40 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ace ){.      mem
15a50 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  set(pBt->pTmpSpa
15a60 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ce, 0, 8);.     
15a70 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15a80 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 4;.    }.  }.
15a90 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
15aa0 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e pBt->pTmpSpace
15ab0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73   allocation.*/.s
15ac0 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54  tatic void freeT
15ad0 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
15ae0 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70  d *pBt){.  if( p
15af0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15b00 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15b10 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71  ace -= 4;.    sq
15b20 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42  lite3PageFree(pB
15b30 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  t->pTmpSpace);. 
15b40 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15b50 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
15b60 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
15b70 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
15b80 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
15b90 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
15ba0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
15bb0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
15bc0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15bd0 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
15be0 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
15bf0 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
15c00 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
15c10 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
15c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15c30 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15c40 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15c50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c60 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
15c70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
15c80 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
15c90 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
15ca0 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
15cb0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
15cc0 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
15cd0 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
15ce0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
15cf0 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
15d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
15d10 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
15d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
15d30 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
15d40 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
15d50 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
15d60 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15d70 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
15d80 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
15d90 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
15da0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
15db0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
15dc0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
15dd0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15de0 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
15df0 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
15e00 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
15e10 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
15e20 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
15e30 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
15e40 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
15e50 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
15e60 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
15e70 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
15e80 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
15e90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
15ea0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
15eb0 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
15ec0 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
15ed0 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
15ee0 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
15ef0 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
15f00 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
15f10 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
15f20 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
15f30 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
15f40 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
15f50 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
15f60 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
15f70 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
15f80 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
15f90 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
15fa0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15fb0 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
15fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15fd0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
15fe0 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20  ger, p->db);.   
15ff0 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
16000 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
16010 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
16020 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
16030 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
16040 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16050 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70  DbFree(0, pBt->p
16060 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
16070 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16080 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16090 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
160a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
160b0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
160c0 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
160d0 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
160e0 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
160f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
16100 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
16110 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16120 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
16130 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
16140 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
16150 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
16160 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
16170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16180 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16190 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20  he "soft" limit 
161a0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
161b0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
161c0 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61  che..** Unused a
161d0 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61  nd unmodified pa
161e0 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79  ges will be recy
161f0 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  cled when the nu
16200 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73  mber of.** pages
16210 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78   in the cache ex
16220 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20  ceeds this soft 
16230 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20  limit.  But the 
16240 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
16250 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  ache is allowed 
16260 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74  to grow larger t
16270 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69  han this limit i
16280 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  f it contains.**
16290 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20   dirty pages or 
162a0 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61  pages still in a
162b0 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ctive use..*/.in
162c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
162d0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
162e0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
162f0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16300 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16320 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16330 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16340 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16350 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
16360 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
16370 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16380 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16390 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
163a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
163b0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
163c0 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74  he "spill" limit
163d0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
163e0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
163f0 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ache..** If the 
16400 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16410 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d  exceeds this lim
16420 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74  it during a writ
16430 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  e transaction,.*
16440 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68  * the pager migh
16450 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70  t attempt to "sp
16460 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68  ill" pages to th
16470 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20  e journal early 
16480 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66  in.** order to f
16490 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a  ree up memory..*
164a0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  *.** The value r
164b0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63  eturned is the c
164c0 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
164d0 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70  e.  If zero is p
164e0 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61  assed.** as an a
164f0 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e  rgument, no chan
16500 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
16510 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73  the spill size s
16520 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73  etting, so.** us
16530 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20  ing mxPage of 0 
16540 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72  is a way to quer
16550 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70  y the current sp
16560 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74  ill size..*/.int
16570 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
16580 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20  SpillSize(Btree 
16590 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
165a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
165b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
165c0 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20   res;.  assert( 
165d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
165e0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
165f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16600 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65  eeEnter(p);.  re
16610 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  s = sqlite3Pager
16620 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74  SetSpillsize(pBt
16630 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
16640 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16650 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16660 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20  urn res;.}..#if 
16670 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16680 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
16690 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
166a0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
166b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
166c0 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
166d0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
166e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
166f0 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
16700 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
16710 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
16720 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16730 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
16740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16750 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16760 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16770 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16780 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
16790 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
167a0 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
167b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
167c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
167d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
167e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
167f0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
16800 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
16810 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
16820 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
16830 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
16840 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
16850 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
16860 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
16870 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
16880 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
16890 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
168a0 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
168b0 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
168c0 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
168d0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
168e0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
168f0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16900 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
16910 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
16920 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
16930 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
16940 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
16950 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
16960 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
16970 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
16980 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
16990 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
169a0 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
169b0 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
169c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
169d0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
169e0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
169f0 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
16a00 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
16a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a20 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
16a30 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
16a40 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
16a50 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
16a60 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
16a70 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
16a80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16a90 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16aa0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16ab0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16ac0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ad0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16af0 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
16b00 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
16b10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16b20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16b30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16b40 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
16b50 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
16b60 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
16b70 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16b80 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
16b90 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
16ba0 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
16bb0 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
16bc0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
16bd0 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
16be0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
16bf0 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
16c00 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
16c10 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
16c20 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
16c30 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
16c40 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
16c50 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
16c60 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
16c70 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
16c80 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
16c90 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16ca0 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
16cb0 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
16cc0 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
16cd0 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
16ce0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
16cf0 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
16d00 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
16d10 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
16d20 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
16d30 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
16d40 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
16d50 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
16d60 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
16d70 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
16d80 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
16d90 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
16da0 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
16db0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
16dc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16dd0 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
16de0 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
16df0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
16e00 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
16e10 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
16e20 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
16e30 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
16e40 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
16e50 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
16e60 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
16e70 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
16e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16e90 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
16ea0 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
16eb0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16ec0 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
16ed0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16ee0 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
16ef0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f00 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16f10 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
16f20 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
16f30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16f40 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
16f50 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
16f60 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
16f70 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
16f80 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
16f90 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
16fa0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
16fb0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16fc0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
16fd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
16fe0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
16ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17000 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
17010 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
17020 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
17030 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17040 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
17050 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
17060 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
17070 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
17080 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
17090 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
170a0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
170b0 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
170c0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
170d0 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
170e0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
170f0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
17100 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
17110 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
17120 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
17130 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
17140 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
17150 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
17160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
17170 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
17180 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
17190 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
171a0 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
171b0 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
171c0 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
171d0 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
171e0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
171f0 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
17200 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
17210 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17230 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17240 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
17250 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
17260 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17270 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
17280 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
17290 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
172a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
172b0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
172c0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
172d0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
172e0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
172f0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
17300 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
17310 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
17320 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
17330 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
17340 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
17350 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
17360 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
17370 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
17380 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
17390 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
173a0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
173b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
173c0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
173d0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
173e0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
173f0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
17400 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
17410 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
17420 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
17430 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
17440 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
17450 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
17460 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
17470 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
17480 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
17490 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
174a0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
174b0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
174c0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
174d0 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
174e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
174f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
17500 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
17510 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
17520 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
17530 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
17540 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
17550 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
17560 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
17570 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
17580 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
17590 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
175a0 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
175b0 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
175c0 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
175d0 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
175e0 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
175f0 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
17600 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
17610 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
17620 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
17630 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
17640 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
17650 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
17660 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
17670 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
17680 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
17690 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
176a0 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
176b0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
176c0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
176d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
176e0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
176f0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17700 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
17710 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17720 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
17730 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
17740 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
17750 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
17760 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
17770 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17780 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
17790 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
177a0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
177b0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
177c0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
177d0 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
177e0 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
177f0 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
17800 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
17810 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
17820 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
17830 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
17840 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
17850 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17860 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
17870 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
17880 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
17890 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
178a0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
178b0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
178c0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
178d0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
178e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
178f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
17910 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17920 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
17930 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
17940 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
17950 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
17960 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
17970 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
17980 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
17990 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
179a0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
179b0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
179c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
179d0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
179e0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
179f0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
17a00 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17a10 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
17a20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17a30 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
17a40 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
17a50 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
17a60 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
17a70 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
17a80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17a90 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17aa0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
17ab0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17ac0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
17ad0 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
17ae0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17af0 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
17b00 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17b10 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17b20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
17b30 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
17b40 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
17b50 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
17b60 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
17b70 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
17b80 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
17b90 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
17ba0 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
17bb0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
17bc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
17bd0 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
17be0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
17bf0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17c00 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
17c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17c20 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
17c30 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
17c40 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
17c50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17c60 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
17c70 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
17c80 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
17c90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17ca0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
17cb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
17cc0 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
17cd0 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
17ce0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
17cf0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
17d00 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17d10 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
17d20 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
17d30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
17d40 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
17d50 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
17d60 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
17d70 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
17d80 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17d90 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
17da0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17db0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17dc0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17de0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17df0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
17e00 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
17e10 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
17e20 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
17e30 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
17e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17e50 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
17e60 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
17e70 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17e80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17e90 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
17ea0 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
17eb0 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
17ec0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17ed0 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
17ee0 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
17ef0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17f00 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
17f10 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
17f20 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
17f30 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
17f40 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
17f50 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
17f60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17f70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
17f80 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
17f90 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  ** If the user h
17fa0 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73  as not set the s
17fb0 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20  afety-level for 
17fc0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
17fd0 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e  nnection.** usin
17fe0 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  g "PRAGMA synchr
17ff0 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74  onous", and if t
18000 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
18010 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
18020 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  * set to the val
18030 75 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ue passed to thi
18040 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68  s function as th
18050 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
18060 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f  er,.** set it so
18070 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
18080 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
18090 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41  OUS!=SQLITE_DEFA
180a0 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e  ULT_WAL_SYNCHRON
180b0 4f 55 53 0a 73 74 61 74 69 63 20 76 6f 69 64 20  OUS.static void 
180c0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
180d0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
180e0 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
180f0 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
18100 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
18110 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
18120 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
18130 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
18140 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
18150 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18160 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18170 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
18180 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
18190 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
181a0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
181b0 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
181c0 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
181d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
181e0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
181f0 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
18200 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18210 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18220 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18230 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18240 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18250 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18260 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
18270 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18280 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
18290 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
182a0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
182b0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
182c0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
182d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
182e0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
182f0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
18300 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
18310 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
18320 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18330 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
18340 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
18350 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
18360 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
18370 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
18380 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
18390 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
183a0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
183b0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
183c0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
183d0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
183e0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
183f0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
18400 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
18410 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
18420 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18430 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18440 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
18450 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
18460 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
18470 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
18480 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
18490 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
184a0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
184b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
184c0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
184d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
184e0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
184f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18500 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18510 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18520 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
18530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18540 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18550 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
18560 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
18570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18580 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18590 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
185a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
185b0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
185c0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
185d0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
185e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18600 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
18610 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
18620 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
18630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18640 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18650 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
18660 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
18670 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
18680 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
18690 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
186a0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
186b0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
186c0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
186d0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
186e0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
186f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18700 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
18710 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
18720 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
18730 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
18740 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
18750 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
18760 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
18770 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
18780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
18790 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
187a0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
187b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
187c0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
187d0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
187e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
187f0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
18800 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
18810 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
18820 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
18830 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
18840 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
18850 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
18860 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
18870 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
18880 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
18890 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
188a0 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
188b0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
188c0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
188d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
188e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
188f0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
18900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
18910 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
18920 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
18930 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
18940 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
18950 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
18960 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
18970 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18980 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
18990 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
189a0 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[18]>2 ){.     
189b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
189c0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
189d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
189e0 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
189f0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18a00 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18a10 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
18a20 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
18a30 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
18a40 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
18a50 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
18a60 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
18a70 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
18a80 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
18a90 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
18aa0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
18ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
18ac0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
18ad0 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
18ae0 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
18af0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
18b00 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
18b10 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
18b20 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
18b30 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
18b40 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
18b50 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
18b60 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
18b70 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
18b80 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
18b90 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
18ba0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
18bb0 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
18bc0 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
18bd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
18be0 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28  age1[19]==2 && (
18bf0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18c00 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
18c10 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
18c20 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
18c30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
18c40 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
18c50 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  er, &isOpen);.  
18c60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18c80 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18c90 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
18ca0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
18cb0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
18cc0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
18cd0 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
18ce0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
18cf0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
18d00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
18d10 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18d20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18d30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18d50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18d60 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c  _NOTADB;.    }el
18d70 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66  se{.      setDef
18d80 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
18d90 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
18da0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
18db0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
18dc0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18dd0 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18de0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18df0 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18e00 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18e10 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18e20 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
18e30 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
18e40 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
18e50 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
18e60 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
18e70 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
18e80 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
18e90 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
18ea0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
18eb0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
18ec0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18ed0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18ee0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18ef0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18f00 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18f10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18f20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18f30 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18f40 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
18f50 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
18f60 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
18f70 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
18f80 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18f90 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
18fa0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
18fb0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
18fc0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18fd0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18ff0 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
19000 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
19010 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
19020 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
19030 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
19040 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
19050 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
19060 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
19070 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
19080 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
19090 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
190a0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
190b0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
190c0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
190d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
190e0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
190f0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
19100 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19110 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19120 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19130 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
19140 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
19150 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
19160 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
19170 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
19180 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
19190 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
191a0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
191b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
191c0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
191d0 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
191e0 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
191f0 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
19200 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
19210 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
19220 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
19230 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
19240 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
19250 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19260 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
19270 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
19280 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
19290 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
192a0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
192b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
192c0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
192d0 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
192e0 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
192f0 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
19300 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
19310 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
19320 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
19330 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19340 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
19350 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
19360 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
19370 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
19380 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
19390 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
193a0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
193b0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
193c0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
193d0 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
193e0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
193f0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
19400 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
19410 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
19420 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
19430 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
19440 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
19450 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
19460 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
19470 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
19480 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
19490 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
194a0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
194b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
194c0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
194d0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
194e0 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
194f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
19500 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
19510 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
19520 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19540 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
19550 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
19560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
19580 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
19590 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
195a0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
195b0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
195c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
195d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
195e0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
195f0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19600 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19610 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
19620 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
19630 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
19640 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
19650 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
19660 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
19670 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
19680 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
19690 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
196a0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
196b0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
196c0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
196d0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
196e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
196f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19700 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
19710 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
19720 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
19730 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
19740 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
19750 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19760 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
19770 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
19780 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
19790 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
197a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
197b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
197c0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
197d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
197e0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
197f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
19800 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
19810 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
19820 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
19830 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
19840 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
19850 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
19860 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
19870 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
19880 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
19890 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
198a0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
198b0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
198c0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
198d0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
198e0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
198f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
19900 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
19910 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
19920 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
19930 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
19940 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
19950 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
19960 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
19970 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
19980 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
19990 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
199a0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
199b0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
199c0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
199d0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
199e0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
199f0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
19a00 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
19a10 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
19a20 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
19a30 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
19a40 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
19a50 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
19a60 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
19a70 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
19a80 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19a90 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19aa0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
19ab0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
19ac0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
19ad0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
19ae0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
19af0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
19b00 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
19b10 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
19b20 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
19b30 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
19b40 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
19b50 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
19b60 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
19b70 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
19b80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
19b90 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
19ba0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
19bb0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
19bc0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19bd0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19be0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19c00 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19c10 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19c20 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19c30 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19c40 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19c50 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19c60 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19c70 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
19c80 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
19c90 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
19ca0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
19cb0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
19cc0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19cd0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19ce0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19cf0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19d00 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19d10 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19d20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19d30 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19d40 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19d50 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19d60 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
19d70 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
19d80 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
19d90 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
19da0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
19db0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
19dc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19dd0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19de0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19df0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19e00 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19e10 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19e20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19e30 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
19e40 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
19e50 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
19e60 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
19e70 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
19e80 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
19e90 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
19ea0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
19eb0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
19ec0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19ed0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19ee0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19ef0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19f00 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19f10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19f20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19f30 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
19f40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
19f50 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
19f60 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
19f70 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
19f80 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
19f90 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
19fa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
19fb0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
19fc0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19fd0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19ff0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1a000 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1a010 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1a020 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1a030 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1a040 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1a050 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1a060 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1a070 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1a080 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1a090 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1a0a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1a0b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1a0c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1a0d0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1a0e0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1a0f0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1a100 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1a110 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1a120 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a130 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1a140 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1a150 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a160 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1a170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a180 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1a190 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a1a0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1a1b0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1a1c0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1a1d0 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1a1e0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
1a1f0 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
1a200 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
1a210 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
1a220 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
1a230 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
1a240 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
1a250 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
1a260 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
1a270 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
1a280 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
1a290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
1a2a0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
1a2b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
1a2c0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
1a2d0 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
1a2e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a2f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a300 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1a310 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
1a320 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
1a330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a340 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
1a350 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
1a360 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
1a370 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
1a380 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
1a390 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1a3a0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
1a3b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1a3c0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
1a3d0 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
1a3e0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
1a3f0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
1a400 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
1a410 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
1a420 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
1a430 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1a440 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
1a450 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
1a460 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
1a470 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
1a480 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
1a490 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
1a4a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a4b0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
1a4c0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
1a4d0 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
1a4e0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1a4f0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
1a500 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
1a510 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
1a520 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
1a530 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
1a540 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
1a550 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
1a560 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
1a570 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
1a580 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
1a590 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
1a5a0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
1a5b0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
1a5c0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
1a5d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a5e0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
1a5f0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1a600 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
1a610 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
1a620 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a630 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
1a640 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
1a650 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
1a660 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
1a670 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1a680 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1a690 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
1a6a0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
1a6b0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
1a6c0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
1a6d0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
1a6e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a6f0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1a700 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
1a710 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1a720 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
1a730 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a740 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
1a750 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
1a760 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
1a770 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1a780 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
1a790 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
1a7a0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
1a7b0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
1a7c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
1a7d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a7e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a7f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a800 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
1a810 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
1a820 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
1a830 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a840 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a850 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
1a860 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
1a870 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
1a880 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1a890 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
1a8a0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
1a8b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
1a8c0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
1a8d0 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
1a8e0 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
1a8f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
1a900 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
1a910 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
1a920 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a930 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
1a940 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
1a950 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
1a960 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
1a970 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
1a980 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
1a990 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
1a9a0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
1a9b0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
1a9c0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a9d0 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
1a9e0 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
1a9f0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
1aa00 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
1aa10 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1aa20 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1aa30 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
1aa40 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
1aa50 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
1aa60 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1aa70 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
1aa80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
1aa90 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
1aaa0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
1aab0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
1aac0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
1aad0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1aae0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
1aaf0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ab00 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
1ab10 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
1ab20 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
1ab30 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ab40 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
1ab50 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1ab60 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
1ab70 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1ab80 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
1ab90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1aba0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
1abb0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
1abc0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1abd0 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1abe0 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1abf0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1ac00 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1ac10 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1ac20 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1ac30 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1ac40 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1ac50 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1ac60 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1ac70 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1ac80 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1ac90 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1aca0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1acb0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1acc0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1acd0 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1ace0 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1acf0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1ad00 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1ad10 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1ad20 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1ad30 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1ad40 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1ad50 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1ad60 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1ad70 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1ad80 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1ad90 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1ada0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1adb0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1adc0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1add0 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1ade0 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1adf0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1ae00 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1ae10 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1ae20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1ae30 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1ae40 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1ae50 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1ae60 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1ae70 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1ae80 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1ae90 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1aea0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1aeb0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1aec0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1aed0 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1aee0 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1aef0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1af00 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1af10 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1af20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1af30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1af40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1af50 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1af60 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1af70 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1af80 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1af90 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1afa0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1afb0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1afc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1afd0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1afe0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1aff0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1b000 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1b010 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1b020 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1b030 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1b040 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1b050 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1b060 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1b070 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b080 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1b090 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b0a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1b0b0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1b0c0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1b0d0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1b0e0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b0f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1b100 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1b110 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1b120 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b130 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1b140 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1b150 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1b160 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1b170 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1b180 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1b190 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b1a0 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1b1b0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1b1c0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1b1d0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1b1e0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1b1f0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1b200 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1b210 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1b220 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1b230 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1b240 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b250 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1b260 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1b270 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1b280 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1b290 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1b2a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b2b0 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1b2c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1b2d0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1b2e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1b2f0 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1b300 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1b310 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1b320 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1b330 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1b340 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1b350 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1b360 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1b370 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1b380 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1b390 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1b3a0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1b3b0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1b3c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1b3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b3e0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1b3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1b400 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1b410 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1b420 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b430 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1b440 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1b450 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1b460 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1b470 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1b480 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1b490 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1b4a0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1b4b0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1b4c0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1b4d0 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1b4e0 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1b4f0 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1b500 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1b510 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b520 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1b530 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1b540 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1b550 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1b560 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1b570 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1b580 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1b590 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1b5a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1b5b0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1b5c0 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1b5d0 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1b5e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1b5f0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1b600 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1b610 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1b620 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1b630 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1b640 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1b650 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1b660 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1b670 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1b680 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1b690 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1b6a0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1b6b0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1b6c0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1b6d0 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1b6e0 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1b6f0 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1b700 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1b710 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1b720 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1b730 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1b740 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1b750 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1b760 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1b770 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1b780 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1b790 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1b7a0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1b7b0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1b7c0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1b7d0 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1b7e0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1b7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b800 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1b810 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1b820 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1b830 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1b840 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1b850 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1b860 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1b870 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1b880 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1b890 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1b8a0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1b8b0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1b8c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b8d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b8e0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1b8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1b910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1b930 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b940 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1b950 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1b960 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1b970 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b980 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1b990 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1b9a0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1b9b0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1b9c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b9d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1b9e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1b9f0 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1ba00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1ba10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ba20 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ba30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1ba40 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1ba50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1ba60 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1ba70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1ba80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1ba90 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1baa0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1bab0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1bac0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1bad0 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1bae0 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1baf0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1bb00 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1bb10 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1bb20 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1bb30 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1bb40 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1bb50 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1bb60 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bb70 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1bb80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1bb90 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1bba0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1bbb0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1bbc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bbd0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1bbe0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1bbf0 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1bc00 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1bc10 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1bc20 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1bc30 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1bc40 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1bc50 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1bc60 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1bc70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1bc80 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1bc90 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1bca0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1bcb0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1bcc0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1bcd0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1bce0 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1bcf0 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1bd00 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1bd10 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1bd20 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1bd30 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1bd40 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1bd50 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1bd60 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1bd70 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1bd80 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1bd90 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1bda0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1bdb0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1bdc0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1bdd0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1bde0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1bdf0 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1be00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1be10 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1be20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1be30 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1be40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1be50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1be60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1be70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1be80 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1be90 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1bea0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1beb0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1bec0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1bed0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1bee0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1bef0 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1bf00 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1bf10 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1bf20 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1bf30 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1bf40 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1bf50 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1bf60 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1bf70 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1bf80 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1bf90 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1bfa0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1bfb0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1bfc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bfd0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1bfe0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1bff0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1c000 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1c010 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1c020 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c030 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c040 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1c050 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1c060 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1c070 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1c080 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1c090 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1c0a0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1c0b0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1c0c0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1c0d0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c0e0 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1c0f0 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1c100 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1c110 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1c120 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1c130 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1c140 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1c150 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1c180 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1c190 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c1c0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1c1d0 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1c1e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c200 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c220 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1c230 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1c240 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1c250 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c260 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1c270 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1c280 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1c290 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1c2a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c2b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1c2c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1c2d0 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1c2e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1c2f0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1c300 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1c310 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1c320 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1c330 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1c340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1c350 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1c360 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1c370 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1c380 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1c390 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1c3a0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1c3b0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1c3c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1c3d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1c3e0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1c3f0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c400 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c410 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1c420 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1c430 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1c440 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1c450 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c460 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1c470 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1c480 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1c490 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1c4a0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1c4b0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1c4c0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1c4d0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1c4e0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1c4f0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1c500 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1c510 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1c520 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1c530 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1c540 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1c550 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1c560 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1c580 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1c590 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1c5a0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1c5b0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1c5c0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1c5d0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1c5e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1c5f0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1c600 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1c610 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1c620 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1c630 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1c640 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1c650 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1c660 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1c670 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1c680 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1c690 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1c6a0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1c6b0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1c6c0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1c6d0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1c6e0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1c6f0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1c700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c710 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1c720 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1c730 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1c740 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1c750 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1c760 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c770 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1c780 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1c790 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1c7a0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1c7b0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1c7c0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1c7d0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1c7e0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1c7f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c800 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c810 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1c820 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1c830 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1c840 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1c850 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1c860 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1c870 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1c880 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1c890 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1c8a0 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1c8b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1c8c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1c8d0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1c8e0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1c8f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1c900 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1c910 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1c920 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1c930 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1c940 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1c950 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1c960 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1c970 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1c980 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1c990 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1c9a0 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1c9b0 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1c9c0 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1c9d0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1c9e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1c9f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ca00 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ca10 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1ca20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1ca30 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1ca40 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1ca50 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1ca60 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1ca70 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1ca80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ca90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1caa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cab0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1cac0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1cad0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1cae0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1caf0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1cb00 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1cb10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1cb20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1cb30 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1cb40 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1cb50 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1cb60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1cb70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1cb80 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1cb90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1cba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1cbb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
1cbc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1cbd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1cbe0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1cbf0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  , iTo);.    }.  
1cc00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cc10 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1cc20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1cc30 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1cc40 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1cc50 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1cc60 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1cc70 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1cc80 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1cc90 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1cca0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1ccb0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1ccc0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1ccd0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1cce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1ccf0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1cd00 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1cd10 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1cd20 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1cd30 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1cd40 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1cd50 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1cd60 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1cd70 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1cd80 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1cd90 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1cda0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1cdb0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1cdc0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1cdd0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1cde0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1cdf0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1ce10 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1ce20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1ce30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1ce40 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ce50 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1ce60 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1ce70 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1ce80 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1ce90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cea0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1ceb0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1cec0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1ced0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1cee0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1cef0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1cf00 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1cf10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1cf20 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1cf30 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1cf40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1cf50 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1cf60 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1cf70 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1cf80 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1cf90 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1cfa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1cfb0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1cfc0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1cfd0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1cfe0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1cff0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d000 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1d010 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1d020 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d030 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d040 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d050 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1d060 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1d070 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1d080 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1d090 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1d0a0 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1d0b0 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1d0c0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1d0d0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1d0e0 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1d0f0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1d100 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1d110 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1d120 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1d130 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1d140 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1d150 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1d160 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1d170 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1d180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d1a0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1d1b0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1d1c0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1d1d0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1d1e0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1d1f0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1d200 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1d210 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1d220 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1d230 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1d240 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1d250 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1d260 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1d270 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1d280 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1d290 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1d2a0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1d2b0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1d2c0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1d2d0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1d2e0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1d2f0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1d300 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1d310 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1d320 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1d330 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1d340 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1d350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1d360 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d370 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d380 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1d390 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1d3a0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1d3b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d3c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d3d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d3e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1d3f0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1d400 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1d410 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1d420 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1d430 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d440 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1d450 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1d460 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1d470 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d4a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d4b0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1d4c0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1d4d0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1d4e0 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1d4f0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1d500 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1d510 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1d520 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1d530 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1d540 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1d550 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1d560 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1d570 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1d580 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d590 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1d5a0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1d5b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d5c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1d5d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1d5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1d5f0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1d600 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1d610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d620 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d630 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1d640 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d650 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d660 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1d670 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1d680 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1d690 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1d6a0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1d6b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1d6c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d6d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1d6e0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1d6f0 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1d700 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d710 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1d720 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1d730 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1d740 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1d750 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1d760 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d770 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1d780 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1d790 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1d7a0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1d7b0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1d7c0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1d7d0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1d7e0 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1d7f0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1d800 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1d810 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1d820 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1d830 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1d840 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1d850 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1d860 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1d870 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1d880 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1d890 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1d8a0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1d8b0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1d8c0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1d8d0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1d8e0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1d8f0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1d900 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1d910 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1d920 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1d930 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1d940 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1d950 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1d960 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1d970 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1d980 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1d990 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1d9a0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1d9b0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1d9c0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1d9d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1d9e0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1d9f0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1da00 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1da10 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1da20 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1da30 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1da40 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1da50 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1da60 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1da70 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1da80 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1da90 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1daa0 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1dab0 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1dac0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1dad0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1dae0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1daf0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1db00 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1db10 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1db20 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1db30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1db40 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1db50 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1db60 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1db70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1db80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1db90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1dba0 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1dbb0 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1dbc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1dbd0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1dbe0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1dbf0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1dc00 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1dc10 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1dc20 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1dc30 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1dc40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1dc50 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1dc60 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1dc70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dc80 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1dc90 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1dca0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1dcb0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1dcc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1dcd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1dcf0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1dd00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1dd10 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1dd20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1dd30 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1dd40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1dd50 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1dd60 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1dd70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1dd80 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1dd90 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1dda0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1ddb0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1ddc0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1ddd0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1dde0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1ddf0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1de00 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1de10 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1de20 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1de30 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1de40 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1de50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1de60 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1de70 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1de80 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1de90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dea0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1deb0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1dec0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1ded0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1dee0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1def0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1df00 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1df10 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1df20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1df30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1df40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1df50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1df60 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1df70 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1df80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1df90 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1dfa0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1dfb0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1dfc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1dfd0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1dfe0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1dff0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1e000 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1e010 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1e020 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1e030 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1e040 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1e050 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1e060 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1e070 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1e080 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1e090 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1e0a0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1e0b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1e0c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1e0d0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1e0e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e100 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1e110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e120 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1e130 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1e140 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1e150 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1e160 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1e170 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1e180 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1e190 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1e1a0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1e1b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1e1c0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1e1d0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1e1e0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1e1f0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1e200 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1e210 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1e220 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1e230 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1e240 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1e250 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1e260 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1e270 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1e280 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1e290 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1e2a0 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1e2b0 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1e2c0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1e2d0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1e2e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1e2f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e300 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1e310 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1e320 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1e330 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1e350 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1e360 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1e370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e380 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1e390 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1e3a0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1e3b0 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1e3c0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1e3d0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1e3e0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1e3f0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1e400 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1e410 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1e420 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1e430 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1e440 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e450 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1e460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e470 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e480 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1e4a0 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e4b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1e4c0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1e4d0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1e4e0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e4f0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1e500 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1e510 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1e520 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1e530 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1e540 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1e550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1e570 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1e580 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1e590 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1e5a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1e5b0 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1e5c0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1e5d0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1e5e0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1e5f0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1e600 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e610 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1e620 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1e630 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1e640 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1e650 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1e660 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1e670 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1e680 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e6b0 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1e6c0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1e6d0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1e700 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1e710 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1e720 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1e730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e740 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1e750 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1e760 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1e770 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1e780 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1e790 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1e7a0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1e7b0 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1e7c0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1e7d0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1e7e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1e7f0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1e800 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e810 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1e820 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1e830 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1e840 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1e850 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1e860 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1e870 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1e880 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1e890 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1e8a0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1e8b0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1e8c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1e8d0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1e8e0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1e8f0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1e900 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1e910 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1e920 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1e930 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1e940 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1e950 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1e960 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1e970 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1e980 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1e990 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1e9a0 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1e9b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e9c0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1e9d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e9e0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1e9f0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1ea00 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1ea10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1ea20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ea30 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1ea40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ea50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ea60 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1ea70 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1ea80 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1ea90 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1eaa0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1eab0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1eac0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1ead0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1eae0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1eaf0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1eb00 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1eb10 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1eb20 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1eb30 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1eb40 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1eb50 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1eb60 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1eb70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eb80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1eb90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1eba0 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1ebb0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1ebc0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1ebd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ebe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ebf0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1ec00 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1ec10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1ec20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1ec30 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1ec40 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1ec50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ec60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ec70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ec80 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1ec90 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1eca0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ecb0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ecc0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1ecd0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1ece0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ecf0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1ed00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ed10 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ed20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ed30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ed40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1ed50 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1ed60 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1ed70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1ed80 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1ed90 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1eda0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1edb0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1edc0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1edd0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1ede0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1edf0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1ee00 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1ee10 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1ee20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1ee30 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1ee40 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1ee50 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1ee60 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1ee70 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1ee80 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1ee90 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1eea0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1eeb0 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1eec0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1eed0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1eee0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1eef0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1ef00 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1ef10 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1ef20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1ef30 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1ef40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ef50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ef60 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1ef70 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ef80 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1ef90 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1efa0 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1efb0 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1efc0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1efd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1efe0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1eff0 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1f000 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1f010 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1f020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1f030 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1f040 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1f050 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1f060 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1f070 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1f080 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1f090 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1f0a0 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1f0b0 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1f0c0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1f0d0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1f0e0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1f0f0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1f100 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1f110 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f120 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1f130 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1f140 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1f150 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1f160 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1f170 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1f180 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1f190 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1f1a0 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1f1b0 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1f1c0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1f1d0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1f1e0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1f1f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1f200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f210 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1f220 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1f230 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f240 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f250 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1f260 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f270 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1f280 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1f290 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1f2a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f2b0 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1f2c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1f2d0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1f2e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1f2f0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1f300 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1f310 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1f320 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1f330 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f340 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f350 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1f360 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1f370 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1f380 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1f390 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1f3a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f3b0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1f3c0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1f3d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1f3e0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f3f0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1f400 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1f410 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1f420 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1f430 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f440 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1f450 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1f460 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1f470 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1f480 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1f490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f4a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1f4b0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f4c0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1f4d0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1f4e0 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1f4f0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1f500 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1f510 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1f520 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1f530 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1f540 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1f550 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1f560 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1f570 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f580 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1f590 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1f5a0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f5b0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1f5c0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1f5d0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1f5e0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1f5f0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1f600 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1f610 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1f620 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1f630 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1f640 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1f650 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1f660 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1f670 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1f680 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1f690 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1f6a0 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1f6b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1f6c0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1f6d0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1f6e0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1f6f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1f700 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1f710 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1f720 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1f730 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f750 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1f760 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1f770 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1f780 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1f790 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1f7a0 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1f7b0 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1f7c0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1f7d0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1f7e0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1f7f0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1f800 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1f810 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f820 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1f830 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1f840 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1f850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1f860 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1f870 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1f880 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1f890 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1f8a0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1f8b0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1f8c0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1f8d0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1f8e0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1f8f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1f900 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f910 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1f920 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1f930 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1f940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1f950 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1f960 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1f970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1f980 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1f990 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1f9a0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1f9b0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1f9c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1f9d0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1f9e0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1f9f0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1fa00 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1fa10 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1fa20 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1fa30 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1fa40 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1fa50 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1fa60 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1fa70 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1fa80 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1fa90 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1faa0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1fab0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1fac0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fad0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1fae0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1faf0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1fb00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fb10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1fb20 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1fb30 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1fb40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fb50 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1fb60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1fb70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fb80 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1fb90 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fba0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1fbb0 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1fbc0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1fbd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fbe0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1fbf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fc00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1fc10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1fc20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1fc30 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1fc40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1fc50 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1fc60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1fc70 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1fc80 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1fc90 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1fca0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1fcb0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1fcc0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1fcd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fcf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1fd00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1fd10 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1fd20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1fd30 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1fd40 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1fd50 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1fd60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1fd70 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1fd80 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1fd90 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1fda0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fdb0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1fdc0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1fdd0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1fde0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1fdf0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1fe00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fe10 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1fe20 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1fe30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1fe40 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1fe50 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1fe60 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1fe70 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1fe80 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1fe90 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1fea0 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1feb0 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1fec0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1fed0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1fee0 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1fef0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1ff00 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1ff10 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1ff20 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1ff30 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1ff40 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1ff50 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1ff60 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1ff70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1ff80 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1ff90 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1ffa0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1ffb0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1ffc0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1ffd0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1ffe0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1fff0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20000 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
20010 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
20020 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
20030 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
20040 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
20050 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
20060 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
20070 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
20080 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
20090 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
200a0 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
200b0 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
200c0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
200d0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
200e0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
200f0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
20100 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
20110 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20120 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
20130 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
20140 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
20150 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
20160 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
20170 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
20180 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
20190 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
201a0 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
201b0 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
201c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
201d0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
201e0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
201f0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
20200 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
20210 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
20220 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
20230 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
20240 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
20250 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
20260 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20270 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
20280 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
20290 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
202a0 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
202b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
202c0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
202d0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
202e0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
202f0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
20300 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
20310 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
20320 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
20330 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
20340 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
20350 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
20360 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
20370 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
20380 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
20390 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
203a0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
203b0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
203c0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
203d0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
203e0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
203f0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
20400 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
20410 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
20420 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
20430 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
20440 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
20450 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
20460 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
20470 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
20480 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20490 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
204a0 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
204b0 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
204c0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
204d0 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
204e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
204f0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
20500 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
20510 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
20520 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
20530 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
20540 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
20550 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
20560 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
20570 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20580 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
20590 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
205a0 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
205b0 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
205c0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
205d0 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
205e0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
205f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20600 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
20610 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
20620 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
20630 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
20640 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
20650 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
20660 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
20670 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
20680 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
20690 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
206a0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
206b0 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
206c0 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
206d0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
206e0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
206f0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
20700 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
20710 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
20720 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
20730 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
20740 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
20750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20760 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
20770 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
20780 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
20790 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
207a0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
207b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
207c0 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
207d0 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
207e0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
207f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
20800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20810 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
20820 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
20830 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20840 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
20850 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
20860 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
20870 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
20880 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
20890 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
208a0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
208b0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
208c0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
208d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
208e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
208f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
20900 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20910 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
20920 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20930 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
20940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20950 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
20960 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
20970 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20980 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
20990 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
209a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
209b0 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
209c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
209d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
209e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
209f0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
20a00 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
20a10 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
20a20 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
20a30 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
20a40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
20a50 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
20a60 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
20a70 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
20a80 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
20a90 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
20aa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20ab0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
20ac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20ad0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
20ae0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
20af0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20b00 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
20b10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
20b20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20b30 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
20b40 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20b50 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
20b60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20b70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20b80 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
20b90 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
20ba0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
20bb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20bc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20bd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
20be0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
20bf0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
20c00 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
20c10 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
20c20 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
20c30 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
20c40 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
20c50 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
20c60 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20c70 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
20c80 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
20c90 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
20ca0 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
20cb0 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
20cc0 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
20cd0 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
20ce0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
20cf0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
20d00 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
20d10 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
20d20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20d30 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
20d40 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
20d50 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
20d60 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
20d70 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20d80 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
20d90 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
20da0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
20db0 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
20dc0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
20dd0 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
20de0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
20df0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
20e00 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
20e10 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
20e20 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
20e30 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
20e40 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
20e50 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
20e60 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
20e70 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
20e80 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
20e90 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
20ea0 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
20eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
20ec0 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
20ed0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
20ee0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
20ef0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
20f00 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
20f10 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
20f20 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
20f30 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
20f40 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
20f50 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
20f60 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
20f70 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
20f80 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20f90 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
20fa0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
20fb0 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
20fc0 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
20fd0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
20fe0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
20ff0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
21000 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
21010 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
21020 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
21030 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
21040 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
21050 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
21060 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21070 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
21080 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
21090 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
210a0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
210b0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
210c0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
210d0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
210e0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
210f0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
21100 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
21110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21120 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
21130 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
21140 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
21150 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
21160 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
21170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21180 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21190 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
211a0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
211b0 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
211c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
211d0 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
211e0 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
211f0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
21200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21210 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
21220 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
21230 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
21240 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
21250 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
21260 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
21270 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
21290 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
212a0 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
212b0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
212c0 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
212d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
212e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
212f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21300 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
21310 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
21320 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
21330 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
21340 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
21350 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
21360 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
21370 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21380 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
21390 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
213a0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
213b0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
213c0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
213d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
213e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
213f0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
21400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21410 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
21420 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
21430 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
21440 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
21450 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
21460 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
21470 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
21480 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
21490 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
214a0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
214b0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
214c0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
214d0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
214e0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
214f0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
21500 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
21510 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
21520 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
21530 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
21540 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
21550 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
21560 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
21570 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
21580 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21590 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
215a0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
215b0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
215c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
215d0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
215e0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
215f0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
21600 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
21610 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21620 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21630 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
21640 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
21650 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
21660 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
21670 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
21680 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
21690 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
216a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
216b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
216c0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
216d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
216e0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
216f0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
21700 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
21710 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
21720 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
21730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21740 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
21750 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
21760 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
21770 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21780 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
21790 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
217a0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
217b0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
217c0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
217d0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
217e0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
217f0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
21800 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
21810 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
21820 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21830 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
21840 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
21850 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
21860 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21870 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
21880 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
21890 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
218a0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
218b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
218c0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
218d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
218e0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
218f0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
21900 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
21910 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
21920 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
21930 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
21940 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
21950 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
21960 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
21970 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
21980 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
21990 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
219a0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
219b0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
219c0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
219d0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
219e0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
219f0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
21a00 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21a10 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
21a20 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
21a30 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21a40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21a50 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
21a60 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
21a70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
21a80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
21a90 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
21aa0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
21ab0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
21ac0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
21ad0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21ae0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
21af0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
21b00 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
21b10 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21b20 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21b30 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21b40 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21b50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
21b60 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
21b70 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
21b80 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
21b90 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
21ba0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
21bb0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
21bc0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
21bd0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
21be0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21bf0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
21c00 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
21c10 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21c20 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
21c30 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
21c40 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
21c50 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
21c60 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
21c70 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
21c80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
21c90 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
21ca0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
21cb0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
21cc0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
21cd0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
21ce0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
21cf0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
21d00 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
21d10 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
21d20 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
21d30 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
21d40 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
21d50 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
21d60 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
21d70 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
21d80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21d90 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
21da0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
21db0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
21dc0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
21dd0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
21de0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
21df0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
21e00 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
21e10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
21e20 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
21e30 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
21e40 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
21e50 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
21e60 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
21e70 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21e80 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
21e90 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
21ea0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
21eb0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
21ec0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
21ed0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
21ee0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
21ef0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
21f00 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
21f10 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
21f20 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
21f30 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
21f40 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
21f50 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
21f60 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
21f70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21f80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21f90 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
21fa0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
21fb0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
21fc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
21fd0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
21fe0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
21ff0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22000 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22010 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
22020 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
22030 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
22040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22050 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22060 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22070 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
22080 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
22090 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
220a0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
220b0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
220c0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
220d0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
220e0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
220f0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
22100 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
22110 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
22120 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
22130 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
22140 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
22150 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
22160 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
22170 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
22180 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
22190 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
221a0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
221b0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
221c0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
221d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
221e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
221f0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
22200 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
22210 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
22220 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
22230 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
22240 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
22250 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
22260 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
22270 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
22280 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
22290 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
222a0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
222b0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
222c0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
222d0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
222e0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
222f0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
22300 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
22310 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
22320 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
22330 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
22340 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
22350 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
22360 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
22370 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22380 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
22390 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
223a0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
223b0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
223c0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
223d0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
223e0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
223f0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
22400 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
22410 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
22420 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22430 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
22440 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
22450 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
22460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22470 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
22480 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22490 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
224a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
224b0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
224c0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
224d0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
224e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
224f0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
22500 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
22510 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
22520 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
22530 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
22540 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22550 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
22560 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
22570 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
22580 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
22590 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
225a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
225b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
225d0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
225e0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
225f0 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
22600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22620 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
22630 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
22640 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
22650 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
22660 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
22670 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
22680 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
22690 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
226a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
226b0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
226c0 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
226d0 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
226e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
226f0 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
22700 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
22710 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
22720 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
22730 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22740 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
22750 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
22760 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
22770 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
22780 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
22790 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
227a0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
227b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
227c0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
227d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
227e0 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
227f0 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
22800 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
22810 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
22820 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
22830 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
22840 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
22850 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
22860 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
22870 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
22880 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
22890 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
228a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
228b0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
228c0 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
228d0 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
228e0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
228f0 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
22900 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
22910 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
22920 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
22930 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
22940 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
22950 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
22960 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
22970 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
22980 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
22990 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
229a0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
229b0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
229c0 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
229d0 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
229e0 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
229f0 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
22a00 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
22a10 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
22a20 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
22a30 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
22a40 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
22a50 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
22a60 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
22a70 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
22a80 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
22a90 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
22aa0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
22ab0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
22ac0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
22ad0 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
22ae0 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
22af0 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
22b00 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
22b10 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
22b20 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
22b30 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
22b40 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
22b50 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
22b60 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
22b70 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
22b80 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
22b90 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
22ba0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
22bb0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
22bc0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
22bd0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
22be0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
22bf0 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
22c00 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
22c10 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
22c20 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
22c30 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
22c40 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
22c50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
22c60 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
22c70 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
22c80 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
22c90 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
22ca0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
22cb0 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
22cc0 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
22cd0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
22ce0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
22cf0 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
22d00 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
22d10 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
22d20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
22d30 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
22d40 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
22d50 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
22d60 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
22d70 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
22d80 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
22d90 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
22da0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
22db0 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
22dc0 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
22dd0 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
22de0 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
22df0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
22e00 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
22e10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
22e20 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
22e30 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
22e40 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
22e50 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
22e60 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
22e70 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
22e80 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
22e90 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
22ea0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
22eb0 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
22ec0 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
22ed0 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
22ee0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
22ef0 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
22f00 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
22f10 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
22f20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
22f30 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
22f40 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
22f50 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
22f60 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
22f70 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
22f80 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
22f90 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
22fa0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
22fb0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
22fc0 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
22fd0 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
22fe0 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
22ff0 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
23000 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23010 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
23020 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
23030 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23060 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
23070 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
230a0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
230b0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
230c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
230e0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
230f0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
23100 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
23110 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
23120 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
23130 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
23140 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
23150 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23170 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
23180 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
23190 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
231a0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
231b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
231c0 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
231d0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
231e0 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
23210 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
23220 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
23230 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
23240 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
23250 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
23260 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
23270 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
23280 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
23290 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
232a0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
232b0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
232c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
232d0 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
232e0 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
232f0 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
23300 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
23310 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
23320 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
23330 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
23340 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
23350 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
23360 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
23370 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
23380 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
23390 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
233a0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
233b0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
233c0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
233d0 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
233e0 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
233f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23400 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
23410 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
23420 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
23430 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23440 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
23450 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
23460 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
23470 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
23480 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
23490 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
234a0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
234b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
234c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
234d0 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
234e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
234f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
23500 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
23510 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23520 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23530 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
23540 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
23550 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
23560 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
23570 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
23580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
23590 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
235a0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
235b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
235c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
235d0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
235e0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
235f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
23600 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
23610 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
23620 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
23630 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
23640 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
23650 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
23660 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
23670 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
23680 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
23690 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
236a0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
236b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
236c0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
236d0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
236e0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
236f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
23700 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
23710 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
23720 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
23730 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
23740 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
23750 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
23760 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
23770 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
23780 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
23790 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
237a0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
237b0 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
237c0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
237d0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
237e0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
237f0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
23800 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
23810 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
23820 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
23830 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
23840 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
23850 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23860 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
23870 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
23880 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
23890 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
238a0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
238b0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
238c0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
238d0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
238e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
238f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23900 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23940 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23970 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
23980 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
23990 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239c0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
239d0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
239e0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
239f0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23a10 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
23a20 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
23a30 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23a60 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
23a70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
23a80 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
23a90 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23aa0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
23ac0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23ad0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
23ae0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
23af0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
23b00 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
23b10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23b20 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
23b30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23b40 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
23b50 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
23b60 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
23b70 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
23b80 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
23b90 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
23ba0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
23bb0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
23bc0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
23bd0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
23be0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
23bf0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
23c00 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
23c10 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
23c20 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
23c30 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
23c40 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
23c50 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
23c60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23c70 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
23c80 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
23c90 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
23ca0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
23cb0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
23cc0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
23cd0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
23ce0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
23cf0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
23d00 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
23d10 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
23d20 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
23d30 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
23d40 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
23d50 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
23d60 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
23d70 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
23d80 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
23d90 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
23da0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
23db0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
23dc0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
23dd0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
23de0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
23df0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
23e00 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
23e10 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
23e20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
23e30 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
23e40 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
23e50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
23e60 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
23e70 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
23e80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23e90 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
23ea0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
23eb0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
23ec0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23ed0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
23ee0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
23ef0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
23f00 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
23f10 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
23f20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
23f30 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
23f40 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
23f50 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
23f60 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
23f70 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
23f80 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
23f90 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
23fa0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
23fb0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
23fc0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
23fd0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
23fe0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
23ff0 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
24000 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
24010 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
24020 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
24030 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
24040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
24050 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
24060 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
24070 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
24090 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
240a0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
240b0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
240c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
240d0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
240e0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
240f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24100 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
24110 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
24120 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
24130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24140 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
24150 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
24160 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
24170 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
24180 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
24190 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
241a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
241b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
241c0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
241d0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
241e0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
241f0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
24200 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
24210 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
24220 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
24230 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
24240 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
24250 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
24260 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
24270 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
24280 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
24290 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
242a0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
242b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
242c0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
242d0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
242e0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
242f0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
24300 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
24310 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
24320 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
24330 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
24340 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
24350 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
24360 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
24370 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
24380 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
24390 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 69 78 2c  Page], pCur->ix,
243a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
243b0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
243c0 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  || memcmp(&info,
243d0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
243e0 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
243f0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
24400 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
24410 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
24420 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
24430 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
24440 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
24450 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
24460 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
24470 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61  0 ){.    int iPa
24480 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
24490 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  ;.    pCur->curF
244a0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
244b0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
244c0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
244d0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
244e0 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69  Cur->ix,&pCur->i
244f0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
24500 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
24510 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
24520 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
24530 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
24540 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
24550 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
24560 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
24570 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
24580 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
24590 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
245a0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
245b0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
245c0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
245d0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
245e0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
245f0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
24600 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
24610 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
24620 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
24630 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
24640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24650 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
24660 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24670 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
24680 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
24690 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
246a0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
246b0 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   */.int sqlite3B
246c0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
246d0 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  dNN(BtCursor *pC
246e0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ur){.  assert( p
246f0 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Cur!=0 );.  retu
24700 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  rn pCur->eState=
24710 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
24720 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24730 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
24740 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22  integer key or "
24750 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62  rowid" for a tab
24760 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69  le btree..** Thi
24770 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
24780 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75  y valid for a cu
24790 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
247a0 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20  nting into a.** 
247b0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62  ordinary table b
247c0 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75  tree.  If the cu
247d0 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
247e0 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72  n index btree or
247f0 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20  .** is invalid, 
24800 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
24810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e  is routine is un
24820 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20  defined..*/.i64 
24830 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
24840 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  gerKey(BtCursor 
24850 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
24860 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24870 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24880 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24890 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
248a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
248b0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
248c0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
248d0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
248e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
248f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24900 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
24910 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66  tes of payload f
24920 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
24930 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72  t pCur is.** cur
24940 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
24950 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62  to.  For table b
24960 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
24970 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   be the amount.*
24980 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20  * of data.  For 
24990 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68  index btrees, th
249a0 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  is will be the s
249b0 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a  ize of the key..
249c0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
249d0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
249e0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
249f0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
24a00 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
24a10 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
24a20 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
24a30 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
24a40 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
24a50 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
24a60 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
24a70 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24a80 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  ID..*/.u32 sqlit
24a90 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
24aa0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
24ab0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
24ac0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24ad0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24ae0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24af0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24b00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24b10 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
24b20 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
24b30 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  d;.}../*.** Give
24b40 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
24b50 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
24b60 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
24b70 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
24b80 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
24b90 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
24ba0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
24bb0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
24bc0 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
24bd0 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
24be0 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
24bf0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
24c00 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
24c10 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
24c20 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
24c30 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
24c40 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
24c50 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
24c60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
24c70 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
24c80 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
24c90 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
24ca0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
24cb0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24cc0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
24cd0 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
24ce0 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
24cf0 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
24d00 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
24d10 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
24d20 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
24d30 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
24d40 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
24d50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
24d60 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
24d70 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
24d80 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
24d90 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
24da0 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
24db0 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
24dc0 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
24dd0 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24de0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
24df0 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
24e00 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
24e10 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
24e20 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
24e30 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
24e40 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
24e50 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
24e60 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
24e70 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
24e80 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
24e90 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
24ea0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
24eb0 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
24ec0 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
24ed0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
24ee0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
24ef0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
24f00 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
24f10 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
24f20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
24f30 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
24f40 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
24f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
24f60 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
24f70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
24f80 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
24f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24fa0 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
24fb0 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
24fc0 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
24fd0 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
24fe0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
24ff0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
25000 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
25010 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
25020 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25030 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
25040 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
25050 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25060 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
25070 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
25080 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
25090 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
250a0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
250b0 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
250c0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
250d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
250e0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
250f0 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
25100 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
25110 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
25120 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
25130 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
25140 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
25150 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
25160 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
25170 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
25180 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
25190 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
251a0 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
251b0 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
251c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
251d0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
251e0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
251f0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
25200 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
25210 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
25220 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
25230 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
25240 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
25250 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
25260 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
25270 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
25280 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
25290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
252a0 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
252b0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
252c0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
252d0 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
252e0 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
252f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25300 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
25310 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
25320 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
25330 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
25340 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
25350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
25360 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
25370 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
25380 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
25390 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
253a0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
253b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
253c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
253d0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
253e0 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
253f0 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
25400 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
25410 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
25420 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
25430 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
25440 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25450 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
25460 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
25470 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
25480 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
25490 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
254a0 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
254b0 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
254c0 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
254d0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
254e0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
254f0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
25500 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
25510 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
25520 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
25530 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
25540 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
25550 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
25560 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
25570 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
25580 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
25590 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
255a0 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
255b0 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
255c0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
255d0 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
255e0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
255f0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
25600 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
25610 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
25620 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
25630 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
25640 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
25650 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
25660 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
25670 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
25680 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
25690 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
256a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
256b0 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
256c0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
256d0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
256e0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
256f0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
25700 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
25710 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
25720 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
25730 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
25740 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
25750 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
25760 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
25770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25780 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
25790 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
257a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
257b0 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
257c0 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
257d0 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
257e0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
257f0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
25800 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
25810 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
25820 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
25830 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
25840 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
25850 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
25860 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
25870 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25880 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
25890 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
258a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
258b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
258c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
258d0 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
258e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
258f0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
25900 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
25910 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
25920 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
25930 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
25940 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
25950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
25970 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25980 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
25990 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
259a0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
259b0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
259c0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
259d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
259e0 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
259f0 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
25a00 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
25a10 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
25a20 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
25a30 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
25a40 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
25a50 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
25a60 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
25a70 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
25a80 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
25a90 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
25aa0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
25ab0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
25ac0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
25ad0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
25ae0 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
25af0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
25b00 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
25b10 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
25b20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
25b30 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
25b40 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
25b50 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
25b60 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
25b70 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
25b80 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
25b90 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
25ba0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
25bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a 2a  verflow pages.**
25bc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
25bd0 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ay allocate spac
25be0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
25bf0 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68 65   populate.** the
25c00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
25c10 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79 20  ist cache array 
25c20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
25c30 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71  low). .** Subseq
25c40 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
25c50 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  his cache to mak
25c60 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
25c70 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
25c80 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69   .** more effici
25c90 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ent..**.** Once 
25ca0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25cb0 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
25cc0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
25cd0 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  it must be.** in
25ce0 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
25cf0 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
25d00 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
25d10 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
25d20 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
25d30 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
25d40 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
25d50 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
25d60 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
25d70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
25d80 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
25d90 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
25da0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
25db0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
25dc0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
25dd0 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
25de0 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
25df0 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
25e00 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
25e10 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
25e20 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
25e30 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
25e40 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
25e50 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
25e60 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
25e70 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
25e80 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
25e90 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25ea0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
25eb0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
25ec0 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
25ed0 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
25ee0 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
25ef0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
25f00 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
25f10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25f20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
25f30 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
25f40 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
25f50 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
25f60 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
25f70 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
25f80 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
25f90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25fa0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
25fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25fc0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
25fd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25fe0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25ff0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
26000 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
26010 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
26020 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26030 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26050 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
26060 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
26070 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26080 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
26090 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
260a0 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
260b0 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20 20  fStart = pBuf;  
260c0 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6f     /* Start of o
260d0 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66 66  riginal out buff
260e0 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  er */.#endif..  
260f0 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
26100 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d  .  assert( eOp==
26110 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a 20  0 || eOp==1 );. 
26120 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26130 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
26140 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
26150 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
26160 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
26170 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26180 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
26190 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
261a0 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
261b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
261c0 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28 20  load;.  assert( 
261d0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43  offset+amt <= pC
261e0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
261f0 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  d );..  assert( 
26200 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67 65  aPayload > pPage
26210 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66 28  ->aData );.  if(
26220 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61 64   (uptr)(aPayload
26230 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 29   - pPage->aData)
26240 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   > (pBt->usableS
26250 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize - pCur->info
26260 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  .nLocal) ){.    
26270 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61  /* Trying to rea
26280 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20  d or write past 
26290 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
262a0 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ata is an error.
262b0 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e    The.    ** con
262c0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69  ditional above i
262d0 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a  s really:.    **
262e0 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70 43      &aPayload[pC
262f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
26300 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
26310 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
26320 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73 20  ].    ** but is 
26330 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73 20  recast into its 
26340 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20  current form to 
26350 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f 76  avoid integer ov
26360 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a  erflow problems.
26370 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
26380 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
26390 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
263a0 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
263b0 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
263c0 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
263d0 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
263e0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
263f0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
26400 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
26410 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
26420 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
26430 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
26440 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
26450 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
26460 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
26470 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
26480 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
26490 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
264a0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
264b0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
264c0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
264d0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
264e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
264f0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
26500 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
26510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26520 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
26530 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
26540 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
26550 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
26560 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
26570 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
26580 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
26590 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
265a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
265b0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
265c0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
265d0 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
265e0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
265f0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
26600 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
26610 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20  it now..    **. 
26620 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66     ** The aOverf
26630 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73  low[] array is s
26640 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72  ized at one entr
26650 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
26660 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  low page.    ** 
26670 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
26680 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20  chain. The page 
26690 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
266a0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
266b0 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72  e is.    ** stor
266c0 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
266d0 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65  0], etc. A value
266e0 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
266f0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20  erflow[] array. 
26700 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74     ** means "not
26710 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65   yet known" (the
26720 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
26730 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
26740 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75   */.    if( (pCu
26750 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26760 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
26770 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
26780 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
26790 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
267a0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
267b0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
267c0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  e;.      if( nOv
267d0 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c  fl>pCur->nOvflAl
267e0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50  loc ){.        P
267f0 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
26800 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
26810 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
26820 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
26830 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
26840 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
26850 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
26860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26880 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
26890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
268a0 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
268b0 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
268c0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
268d0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
268e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
268f0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
26900 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  (pCur->aOverflow
26910 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f  , 0, nOvfl*sizeo
26920 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  f(Pgno));.      
26930 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
26940 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  = BTCF_ValidOvfl
26950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26960 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
26970 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26980 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
26990 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
269a0 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  .      ** entry 
269b0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
269c0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
269d0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
269e0 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72  kip.      ** dir
269f0 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20  ectly to it..   
26a00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
26a10 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26a20 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
26a30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78   ){.        iIdx
26a40 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53   = (offset/ovflS
26a50 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ize);.        ne
26a60 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
26a70 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
26a80 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
26a90 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
26aa0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
26ab0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
26ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26ad0 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69  amt>0 );.    whi
26ae0 6c 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a  le( nextPage ){.
26af0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
26b00 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
26b10 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26b20 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
26b30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26b40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26b50 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dx]==0.         
26b60 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f       || pCur->aO
26b70 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e  verflow[iIdx]==n
26b80 65 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20  extPage.        
26b90 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
26ba0 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75  _DB );.      pCu
26bb0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26bc0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a  x] = nextPage;..
26bd0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
26be0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
26bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
26c00 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
26c10 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
26c20 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
26c30 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
26c40 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
26c50 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26c60 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
26c70 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
26c80 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
26c90 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
26ca0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
26cb0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
26cc0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
26cd0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
26ce0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
26cf0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
26d00 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
26d10 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
26d20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
26d30 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
26d40 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
26d50 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
26d60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26d70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
26d80 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
26d90 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
26da0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
26db0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
26dc0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
26dd0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
26de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26df0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
26e00 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
26e10 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
26e20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
26e30 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
26e40 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
26e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e60 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
26e70 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
26e80 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
26e90 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
26ea0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
26eb0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
26ec0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
26ed0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
26ee0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
26ef0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26f00 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26f10 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
26f20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20  lite3_file *fd; 
26f30 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f       /* File fro
26f40 6d 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69  m which to do di
26f50 72 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65  rect overflow re
26f60 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  ad */.#endif.   
26f70 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74       int a = amt
26f80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20  ;.        if( a 
26f90 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
26fa0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
26fb0 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20   a = ovflSize - 
26fc0 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20  offset;.        
26fd0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
26fe0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26ff0 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a  _READ.        /*
27000 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c   If all the foll
27010 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
27020 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
27030 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20     **   1) this 
27040 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
27050 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20  ion, and .      
27060 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69    **   2) data i
27070 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20  s required from 
27080 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
27090 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  s overflow page,
270a0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
270b0 20 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f    3) there is no
270c0 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
270d0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
270e0 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
270f0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
27100 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
27110 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68        **   5) th
27120 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
27130 20 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20   the WAL file.  
27140 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74        **   6) at
27150 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
27160 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
27170 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
27180 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
27190 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
271a0 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
271b0 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
271c0 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
271d0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
271e0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
271f0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
27200 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
27210 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
27220 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
27230 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
27240 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
27250 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
27260 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
27270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27280 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20      if( eOp==0  
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
272c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
272d0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
272e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27300 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
27310 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
27320 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27330 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27350 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
27360 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
27370 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
27380 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
27390 73 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a  s     /* (4) */.
273a0 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
273b0 71 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61  qlite3PagerUseWa
273c0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  l(pBt->pPager, n
273d0 65 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f  extPage)       /
273e0 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
273f0 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
27400 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
27410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27420 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
27430 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
27440 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
27450 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
27460 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
27470 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
27480 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
27490 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
274a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274b0 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28       /* due to (
274c0 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  6) */.          
274d0 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
274e0 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
274f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27500 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
27510 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
27520 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
27530 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
27540 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
27550 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
27560 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
27570 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
27580 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
27590 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
275a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
275b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
275c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
275d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
275e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
275f0 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a  Page, &pDbPage,.
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
27610 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  Op==0 ? PAGER_GE
27620 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
27630 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
27640 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27660 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
27670 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
27680 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
27690 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
276a0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
276b0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
276c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
276d0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
276e0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
276f0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
27700 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27710 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
27720 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
27730 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
27740 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27750 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27760 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
27770 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30        if( amt==0
27780 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27790 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
277a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
277b0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
277c0 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20       iIdx++;.   
277d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
277e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
277f0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
27800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27810 54 5f 42 4b 50 54 3b 20 2f 2a 20 4f 76 65 72 66  T_BKPT; /* Overf
27820 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70  low chain ends p
27830 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20  rematurely */.  
27840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27850 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27860 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
27870 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
27880 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
27890 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
278a0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
278b0 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
278c0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
278d0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
278e0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
278f0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
27900 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
27910 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
27920 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
27930 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
27940 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
27950 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
27960 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
27970 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
27980 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
27990 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
279a0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
279b0 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
279c0 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
279d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
279e0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
279f0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27a00 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
27a10 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
27a20 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
27a30 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
27a40 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
27a50 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
27a60 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
27a70 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
27a80 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
27a90 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
27aa0 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
27ab0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
27ac0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
27ad0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
27ae0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
27af0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
27b00 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
27b10 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
27b20 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
27b30 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
27b40 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
27b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
27b60 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
27b70 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
27b80 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
27b90 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
27ba0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27bb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27bc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
27bd0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27be0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27bf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27c00 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
27c10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
27c20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27c30 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ix<pCur->apPage[
27c40 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27c50 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
27c60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27c70 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
27c80 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
27c90 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
27ca0 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74  .** This variant
27cb0 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
27cc0 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20  Payload() works 
27cd0 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72 73  even if the curs
27ce0 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e  or has not.** in
27cf0 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49   the CURSOR_VALI
27d00 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73 20  D state.  It is 
27d10 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65  only used by the
27d20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
27d30 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ad().** interfac
27d40 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
27d50 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
27d60 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  OB.static SQLITE
27d70 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63  _NOINLINE int ac
27d80 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
27d90 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
27da0 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73  pCur,.  u32 offs
27db0 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20  et,.  u32 amt,. 
27dc0 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20   void *pBuf.){. 
27dd0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20   int rc;.  if ( 
27de0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27df0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
27e00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27e10 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61  E_ABORT;.  }.  a
27e20 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27e30 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27e40 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52  );.  rc = btreeR
27e50 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
27e60 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65  tion(pCur);.  re
27e70 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61  turn rc ? rc : a
27e80 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
27e90 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
27ea0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  pBuf, 0);.}.int 
27eb0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27ec0 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75 72  oadChecked(BtCur
27ed0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f  sor *pCur, u32 o
27ee0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
27ef0 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69  void *pBuf){.  i
27f00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
27f10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
27f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75 72  .    assert( cur
27f30 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27f40 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74  pCur) );.    ret
27f50 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27f60 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27f70 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
27f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
27f90 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
27fa0 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66  Checked(pCur, of
27fb0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29  fset, amt, pBuf)
27fc0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
27fd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
27fe0 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
27ff0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
28000 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
28010 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
28020 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
28030 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
28040 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
28050 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
28060 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
28070 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
28080 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20  if index btrees 
28090 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
280a0 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61  0) and is the da
280b0 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20  ta for.** table 
280c0 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69  btrees (pPage->i
280d0 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e  ntKey==1). The n
280e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
280f0 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b  f available.** k
28100 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
28110 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  en into *pAmt.  
28120 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
28130 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72  n the value.** r
28140 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
28150 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   be a valid poin
28160 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
28170 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
28180 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
28190 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
281a0 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
281b0 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
281c0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
281d0 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
281e0 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
281f0 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
28200 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
28210 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
28220 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
28230 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
28240 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
28250 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
28260 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
28270 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
28280 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
28290 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
282a0 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
282b0 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
282c0 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  le.** the key/da
282d0 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
282e0 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
282f0 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
28300 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
28310 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
28320 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
28330 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
28340 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
28350 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
28360 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
28370 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
28380 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
28390 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
283a0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
283b0 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20  atic const void 
283c0 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20  *fetchPayload(. 
283d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
283e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
283f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
28400 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
28410 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20  /.  u32 *pAmt   
28420 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
28430 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
28440 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
28450 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  here */.){.  u32
28460 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20   amt;.  assert( 
28470 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
28480 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
28490 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
284a0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
284b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
284c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
284d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
284e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
284f0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28500 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28510 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28520 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
28530 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28540 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ix<pCur->apPage[
28550 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
28560 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
28570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28580 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
28590 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
285a0 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67  load>pCur->apPag
285b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
285c0 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
285d0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
285e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
285f0 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67  load<pCur->apPag
28600 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
28610 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
28620 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
28630 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61  (int)(pCur->apPa
28640 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28650 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
28660 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
28670 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  ;.  if( pCur->in
28680 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20  fo.nLocal<amt ) 
28690 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  amt = pCur->info
286a0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74  .nLocal;.  *pAmt
286b0 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e   = amt;.  return
286c0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
286d0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
286e0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
286f0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
28700 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
28710 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
28720 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
28730 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
28740 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
28750 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
28760 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
28770 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
28780 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
28790 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
287a0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
287b0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
287c0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
287d0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
287e0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
287f0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
28800 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
28810 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
28820 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
28830 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
28840 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
28850 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
28860 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
28870 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
28880 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
28890 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
288a0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
288b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
288c0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
288d0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
288e0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
288f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
28900 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
28910 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
28920 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
28930 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28940 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
28950 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
28960 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
28970 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
28980 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
28990 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
289a0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
289b0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
289c0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
289d0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
289e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
289f0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
28a00 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
28a10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28a20 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
28a30 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
28a40 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
28a50 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
28a60 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
28a70 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
28a80 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
28a90 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
28aa0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
28ab0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
28ac0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
28ad0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
28ae0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
28af0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28b00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
28b10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28b20 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
28b30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
28b40 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
28b50 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
28b60 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
28b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28b90 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28ba0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
28bb0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
28bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28bd0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
28be0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
28bf0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
28c00 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
28c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
28c20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
28c30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
28c40 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
28c50 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28c60 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28c70 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28c80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28c90 2d 3e 69 50 61 67 65 2b 2b 5d 20 3d 20 70 43 75  ->iPage++] = pCu
28ca0 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 69  r->ix;.  pCur->i
28cb0 78 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  x = 0;.  return 
28cc0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
28cd0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43  Bt, newPgno, &pC
28ce0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28cf0 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72   pCur, pCur->cur
28d20 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a  PagerFlags);.}..
28d30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
28d40 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
28d50 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
28d60 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
28d70 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
28d80 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
28d90 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
28da0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
28db0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
28dc0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
28dd0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
28de0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
28df0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
28e00 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
28e10 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
28e20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
28e30 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
28e40 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
28e50 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
28e60 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
28e70 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
28e80 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
28e90 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
28ea0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
28eb0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
28ec0 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
28ed0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
28ee0 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
28ef0 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
28f20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
28f30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
28f40 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
28f50 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
28f60 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
28f70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28f80 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
28f90 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
28fa0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
28fb0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
28fc0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
28fd0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28fe0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
28ff0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
29000 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
29010 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
29020 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
29030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
29040 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
29050 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
29060 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
29070 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
29080 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
29090 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
290a0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
290b0 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
290c0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
290d0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
290e0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
290f0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
29100 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
29110 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
29120 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
29130 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
29140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
29150 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
29160 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
29170 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29180 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29190 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
291a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
291b0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
291c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
291d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
291e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
291f0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
29200 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
29210 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
29220 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
29230 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
29240 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29250 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
29260 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29270 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
29280 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
29290 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
292a0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
292b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
292c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
292d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
292e0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
292f0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
29300 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
29310 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
29320 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  >ix = pCur->aiId
29330 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29340 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
29350 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
29360 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
29370 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  -]);.}../*.** Mo
29380 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29390 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
293a0 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
293b0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
293c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
293d0 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
293e0 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
293f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
29400 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
29410 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
29420 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
29430 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
29440 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
29450 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
29460 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
29470 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
29480 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
29490 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
294a0 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
294b0 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
294c0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
294d0 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
294e0 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
294f0 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
29500 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
29510 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
29520 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
29530 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
29540 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
29550 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
29560 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
29570 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
29580 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
29590 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
295a0 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
295b0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
295c0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
295d0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
295e0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
295f0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
29600 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
29610 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
29620 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
29630 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
29640 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
29650 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
29660 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
29670 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
29680 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
29690 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
296a0 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
296b0 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
296c0 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
296d0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
296e0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
296f0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
29700 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
29710 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
29720 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
29730 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
29740 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
29750 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
29760 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
29770 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
29780 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
29790 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
297a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
297b0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
297c0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
297d0 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
297e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
297f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29800 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
29820 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
29830 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29850 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
29860 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29870 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
29880 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
29890 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
298a0 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
298b0 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
298c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
298d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
298e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
298f0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
29900 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
29910 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
29920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
29930 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
29940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
29950 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
29960 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
29970 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
29980 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29990 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
299a0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73   do{.        ass
299b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
299c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
299d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 );.        rel
299e0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
299f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29a00 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20  r->iPage--]);.  
29a10 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
29a20 2d 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->iPage);.      
29a30 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a  goto skip_init;.
29a40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29a50 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29a60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29a70 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29a80 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29ab0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29ac0 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
29ad0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
29ae0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
29af0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
29b00 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
29b10 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
29b30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
29b40 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b60 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
29b70 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29b80 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74  ALID;.       ret
29b90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
29ba0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
29bb0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  0;.    pCur->cur
29bc0 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61  IntKey = pCur->a
29bd0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
29be0 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
29bf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
29c00 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29c10 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
29c20 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20  noRoot );..  /* 
29c30 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
29c40 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
29c50 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
29c60 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
29c70 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65  cursor.  ** expe
29c80 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
29c90 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
29ca0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
29cb0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
29cc0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
29cd0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
29ce0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
29cf0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
29d00 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e  ase,.  ** return
29d10 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
29d20 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a  PT error. .  **.
29d30 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72    ** Earlier ver
29d40 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
29d50 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69  assumed that thi
29d60 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  s test could not
29d70 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68   fail.  ** if th
29d80 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20  e root page was 
29d90 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77  already loaded w
29da0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
29db0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e  n was called (i.
29dc0 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d  e..  ** if pCur-
29dd0 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20  >iPage>=0). But 
29de0 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69  this is not so i
29df0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
29e00 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a  s corrupted .  *
29e10 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  * in such a way 
29e20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20  that page pRoot 
29e30 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61  is linked into a
29e40 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74   second b-tree t
29e50 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74  able .  ** (or t
29e60 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a  he freelist).  *
29e70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  /.  assert( pRoo
29e80 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20  t->intKey==1 || 
29e90 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pRoot->intKey==0
29ea0 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d   );.  if( pRoot-
29eb0 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70  >isInit==0 || (p
29ec0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
29ed0 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )!=pRoot->intKey
29ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
29ef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29f00 50 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  PT;.  }..skip_in
29f10 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
29f20 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
29f30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
29f40 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29f50 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29f60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29f70 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29f80 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29f90 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66  >apPage[0];.  if
29fa0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
29fb0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29fc0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29fd0 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
29fe0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
29ff0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
2a000 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
2a010 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
2a020 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a030 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
2a040 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2a050 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
2a060 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
2a070 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
2a080 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2a090 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
2a0a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
2a0b0 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
2a0c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2a0d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2a0e0 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
2a0f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2a100 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2a110 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
2a120 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2a130 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
2a140 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
2a150 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2a160 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
2a170 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
2a180 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2a190 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
2a1a0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
2a1b0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
2a1c0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
2a1d0 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
2a1e0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a1f0 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2a200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2a210 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2a220 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2a230 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a240 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a250 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a260 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a270 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2a280 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a290 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2a2a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a2b0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
2a2c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a2d0 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  >ix<pPage->nCell
2a2e0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
2a2f0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2a300 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  (pPage, pCur->ix
2a310 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
2a320 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
2a330 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
2a340 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2a350 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a360 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
2a370 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2a380 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2a390 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
2a3a0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
2a3b0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
2a3c0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
2a3d0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
2a3e0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
2a3f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2a400 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
2a410 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2a420 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
2a430 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
2a440 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
2a450 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
2a460 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
2a470 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
2a480 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
2a490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
2a4a0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
2a4b0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2a4c0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
2a4d0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
2a4e0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
2a4f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2a500 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a510 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a520 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2a530 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a540 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2a550 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
2a560 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a570 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a590 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a5a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2a5b0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
2a5c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a5d0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
2a5e0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2a5f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a600 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a610 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2a620 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2a630 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
2a640 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2a650 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
2a660 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a670 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d    }.  pCur->ix =
2a680 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2a690 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a6a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2a6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2a6c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a6d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
2a6e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2a6f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
2a700 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2a710 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2a720 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2a730 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2a740 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2a750 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2a760 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2a770 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2a780 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2a790 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2a7a0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a7b0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2a7c0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2a7d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a7e0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2a7f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2a800 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a810 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a820 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a830 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2a840 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2a850 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2a860 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a880 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
2a890 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a8a0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2a8b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a8c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a8d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a8e0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a8f0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2a900 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2a910 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2a920 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
2a930 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2a940 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
2a950 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
2a960 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
2a970 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2a980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a990 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2a9a0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2a9b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a9c0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2a9d0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2a9e0 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2a9f0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2aa00 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2aa10 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2aa20 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2aa30 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2aa40 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2aa50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2aa60 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2aa70 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2aa80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2aa90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2aaa0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2aab0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2aac0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2aad0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2aae0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2aaf0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2ab00 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2ab10 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2ab20 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2ab30 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2ab40 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2ab50 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2ab60 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2ab70 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2ab80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2ab90 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2aba0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2abb0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2abc0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2abd0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2abe0 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2abf0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2ac00 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2ac10 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2ac20 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2ac30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2ac40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2ac50 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2ac60 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2ac70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2ac80 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
2ac90 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2aca0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
2acb0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2acc0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2acd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2ace0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
2acf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ad00 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2ad10 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2ad20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
2ad40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2ad50 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2ad60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ad70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2ad80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ad90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2ada0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
2adb0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
2adc0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
2add0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ade0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2adf0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2ae00 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2ae10 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2ae20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2ae30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ae40 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2ae50 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2ae60 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ast;.      }else
2ae70 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2ae80 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2ae90 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2aea0 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a  }.   .    }.  }.
2aeb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2aec0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2aed0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
2aee0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
2aef0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
2af00 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
2af10 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
2af20 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
2af30 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
2af40 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
2af50 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
2af60 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
2af70 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
2af80 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
2af90 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
2afa0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
2afb0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
2afc0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
2afd0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
2afe0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
2aff0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
2b000 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
2b010 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2b020 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2b030 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
2b040 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
2b050 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
2b060 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
2b070 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
2b080 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
2b090 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
2b0a0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
2b0b0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
2b0c0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
2b0d0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
2b0e0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
2b0f0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
2b100 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
2b110 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
2b120 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
2b130 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
2b140 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
2b150 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
2b160 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
2b170 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
2b180 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2b190 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2b1a0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2b1b0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2b1c0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
2b1d0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2b1e0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
2b1f0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
2b200 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b210 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
2b220 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
2b230 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
2b240 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
2b250 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
2b260 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2b270 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2b280 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2b2a0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
2b2b0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2b2c0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
2b2d0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2b2e0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2b2f0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2b300 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2b310 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
2b320 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2b330 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69  Key..**.** For i
2b340 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65  ndex tables, the
2b350 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e   pIdxKey->eqSeen
2b360 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f   field is set to
2b370 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65   1 if there.** e
2b380 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69  xists an entry i
2b390 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2b3a0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
2b3b0 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69   pIdxKey.  .*/.i
2b3c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
2b3d0 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
2b3e0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
2b3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2b400 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
2b410 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
2b420 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
2b430 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
2b440 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
2b450 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
2b460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
2b470 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
2b480 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
2b490 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
2b4a0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
2b4b0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
2b4c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
2b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b4e0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
2b4f0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
2b500 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
2b510 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
2b520 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
2b530 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b540 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b560 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b570 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b580 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2b590 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
2b5a0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
2b5b0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
2b5c0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61  yInfo==0) );.  a
2b5d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b5e0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2b5f0 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30  D || (pIdxKey==0
2b600 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74  )==(pCur->curInt
2b610 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Key!=0) );..  /*
2b620 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
2b630 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
2b640 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
2b650 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
2b660 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
2b670 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
2b680 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
2b690 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
2b6a0 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20  ( pIdxKey==0.   
2b6b0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
2b6c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2b6d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b6e0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2b6f0 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69  y)!=0.  ){.    i
2b700 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2b710 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2b720 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2b730 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b740 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2b750 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2b760 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2b770 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
2b780 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2b790 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20  AtLast)!=0 ){.  
2b7a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31        *pRes = -1
2b7b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b7c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b7d0 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20    }.      /* If 
2b7e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6b 65  the requested ke
2b7f0 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68  y is one more th
2b800 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  an the previous 
2b810 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  key, then.      
2b820 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20 74 68  ** try to get th
2b830 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ere using sqlite
2b840 33 42 74 72 65 65 4e 65 78 74 28 29 20 72 61 74  3BtreeNext() rat
2b850 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a  her than a full.
2b860 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20        ** binary 
2b870 73 65 61 72 63 68 2e 20 20 54 68 69 73 20 69 73  search.  This is
2b880 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2b890 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72   only.  The corr
2b8a0 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20  ect answer.     
2b8b0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74   ** is still obt
2b8c0 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68  ained without th
2b8d0 69 73 20 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c  is ase, only a l
2b8e0 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65  ittle more slowe
2b8f0 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ly */.      if( 
2b900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b  pCur->info.nKey+
2b910 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43  1==intKey && !pC
2b920 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2b930 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2b940 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2b950 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2b960 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2b970 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2b980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2b990 20 20 69 66 28 20 2a 70 52 65 73 3d 3d 30 20 29    if( *pRes==0 )
2b9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43  {.          getC
2b9b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
2b9c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75           if( pCu
2b9d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2b9e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2b9f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ba00 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2ba10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ba20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2ba30 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
2ba40 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
2ba50 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
2ba60 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
2ba70 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
2ba80 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
2ba90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
2baa0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2bab0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
2bac0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2bad0 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
2bae0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
2baf0 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
2bb00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2bb10 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2bb20 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
2bb30 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
2bb40 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
2bb50 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2bb60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2bb70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2bb80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2bb90 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2bba0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2bbb0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
2bbc0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2bbd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2bbe0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2bbf0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
2bc00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2bc10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
2bc20 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
2bc30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bc40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
2bc50 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2bc60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2bc70 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
2bc80 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
2bc90 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2bca0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2bcb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2bcc0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
2bcd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bce0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2bcf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2bd00 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75  intKey==pCur->cu
2bd10 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73  rIntKey );.  ass
2bd20 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
2bd30 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
2bd40 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
2bd50 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
2bd60 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
2bd70 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
2bd80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2bd90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2bda0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20  >iPage];.    u8 
2bdb0 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2bde0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
2bdf0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  Page */..    /* 
2be00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
2be10 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
2be20 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
2be30 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
2be40 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
2be50 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
2be60 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
2be70 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
2be80 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
2be90 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
2bea0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
2beb0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
2bec0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
2bed0 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
2bee0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
2bef0 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
2bf00 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
2bf10 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
2bf20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
2bf30 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
2bf40 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
2bf50 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
2bf60 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
2bf70 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
2bf80 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
2bf90 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
2bfa0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
2bfb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bfc0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
2bfd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bfe0 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
2bff0 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
2c000 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
2c010 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2c020 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73      assert( bias
2c030 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73  Right==0 || bias
2c040 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20  Right==1 );.    
2c050 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69  idx = upr>>(1-bi
2c060 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78  asRight); /* idx
2c070 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75   = biasRight ? u
2c080 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32  pr : (lwr+upr)/2
2c090 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69  ; */.    pCur->i
2c0a0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2c0b0 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d    if( xRecordCom
2c0c0 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pare==0 ){.     
2c0d0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2c0e0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
2c0f0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
2c100 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
2c110 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20  pPage, idx);.   
2c120 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
2c130 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20  intKeyLeaf ){.  
2c140 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
2c150 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
2c160 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2c170 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
2c180 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
2c190 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2c1a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2c1b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c1c0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
2c1d0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
2c1e0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
2c1f0 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
2c200 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2c210 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2c220 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2c230 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
2c240 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2c250 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
2c260 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
2c270 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
2c280 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
2c290 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2c2a0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
2c2b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2c2c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c2d0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
2c2e0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
2c2f0 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2c300 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2c310 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ){.            l
2c330 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
2c340 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c350 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20  o_next_layer;.  
2c360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c370 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2c380 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2c390 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2c3a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2c3b0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2c3c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2c3d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c3e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2c3f0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c400 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2c410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c430 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2c440 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c450 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c460 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c470 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c480 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
2c490 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2c4a0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
2c4b0 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53  int nCell;  /* S
2c4c0 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c  ize of the pCell
2c4d0 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a   cell in bytes *
2c4e0 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  /.        pCell 
2c4f0 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2c500 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a  r(pPage, idx);..
2c510 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2c520 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
2c530 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
2c540 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
2c550 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
2c560 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
2c570 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
2c580 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
2c590 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
2c5a0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
2c5b0 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
2c5c0 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
2c5d0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
2c5e0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
2c5f0 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
2c600 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
2c610 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
2c620 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
2c630 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
2c640 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
2c650 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
2c660 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
2c670 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
2c680 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
2c690 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
2c6a0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
2c6b0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
2c6c0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
2c6d0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
2c6e0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
2c6f0 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
2c700 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
2c710 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
2c720 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
2c730 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
2c740 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2c750 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
2c760 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2c770 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
2c780 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
2c790 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
2c7a0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2c7b0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2c7c0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
2c7d0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
2c7e0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2c7f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2c800 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
2c810 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2c820 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2c830 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2c840 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2c850 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
2c860 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2c870 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
2c880 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
2c890 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
2c8a0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
2c8b0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
2c8c0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
2c8d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
2c8e0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
2c8f0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
2c900 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2c910 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
2c920 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
2c930 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2c940 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
2c950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2c960 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2c970 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+2==pPage->aDa
2c980 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2c990 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2c9a0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2c9b0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
2c9c0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2c9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c9e0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
2c9f0 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
2ca00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
2ca10 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
2ca20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
2ca30 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
2ca40 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
2ca50 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
2ca60 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
2ca70 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
2ca80 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
2ca90 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
2caa0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
2cab0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
2cac0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
2cad0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
2cae0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
2caf0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
2cb00 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2cb10 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2cb20 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64  upt, the xRecord
2cb30 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20  Compare routine 
2cb40 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20  may read.       
2cb50 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20     ** up to two 
2cb60 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65  varints past the
2cb70 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66   end of the buff
2cb80 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20  er. An extra 18 
2cb90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79  .          ** by
2cba0 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69  tes of padding i
2cbb0 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74  s allocated at t
2cbc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2cbd0 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20  ffer in.        
2cbe0 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68    ** case this h
2cbf0 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20  appens.  */.    
2cc00 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
2cc10 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2cc20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
2cc30 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
2cc40 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2cc50 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  ze;.          pP
2cc60 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
2cc70 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
2cc80 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
2cc90 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
2cca0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
2ccb0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
2ccc0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2ccd0 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65  l<0 );   /* True
2cce0 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20   if key size is 
2ccf0 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a  2^32 or more */.
2cd00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2cd10 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20  se( nCell==0 ); 
2cd20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2cd30 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2cd40 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20   0x00 */.       
2cd50 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2cd60 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==1 );  /* Inv
2cd70 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2cd80 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a  0x80 0x80 0x01 *
2cd90 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2cda0 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29  case( nCell==2 )
2cdb0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65  ;  /* Minimum le
2cdc0 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69  gal index key si
2cdd0 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ze */.          
2cde0 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20  if( nCell<2 ){. 
2cdf0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ce00 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2ce10 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2ce20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ce30 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2ce40 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
2ce50 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
2ce60 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b  loc( nCell+18 );
2ce70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ce80 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
2ce90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2cea0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2ceb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2cec0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2ced0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2cee0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2cef0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2cf00 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
2cf10 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2cf20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
2cf30 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
2cf40 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
2cf50 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2cf60 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
2cf70 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  vfl;.          i
2cf80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2cf90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2cfa0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2cfb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2cfc0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2cfd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2cfe0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2cff0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
2d000 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
2d010 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d020 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2d030 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2d040 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
2d050 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
2d060 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2d070 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
2d080 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
2d090 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2d0a0 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
2d0b0 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
2d0c0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2d0d0 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
2d0e0 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
2d0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2d100 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2d110 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
2d120 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2d130 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2d140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d150 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
2d160 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
2d170 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2d180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d190 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2d1a0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2d1b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2d1c0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
2d1d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d1e0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d1f0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d200 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
2d210 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d220 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2d230 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2d240 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2d250 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2d260 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2d270 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
2d280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d290 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
2d2a0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
2d2b0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2d2c0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
2d2d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2d2e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
2d2f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d300 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d310 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  >ix<pCur->apPage
2d320 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2d330 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2d340 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2d350 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2d360 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2d370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d380 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d390 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2d3a0 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2d3b0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2d3c0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2d3d0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2d3e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d3f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d400 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2d410 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2d420 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2d430 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2d440 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2d450 69 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  ix = (u16)lwr;. 
2d460 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d470 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2d480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2d490 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2d4a0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2d4b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2d4d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d4e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2d4f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2d500 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
2d510 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
2d520 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
2d530 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
2d540 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2d550 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
2d560 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
2d570 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2d580 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
2d590 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
2d5a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2d5b0 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
2d5c0 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
2d5d0 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
2d5e0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
2d5f0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
2d600 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
2d610 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2d620 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
2d630 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
2d640 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
2d650 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
2d660 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
2d670 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
2d680 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
2d690 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
2d6a0 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
2d6b0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
2d6c0 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
2d6d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
2d6e0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
2d6f0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
2d700 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
2d710 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
2d720 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
2d730 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2d740 72 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66  rn an estimate f
2d750 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
2d760 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
2d770 6c 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  le that pCur is.
2d780 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ** pointing to. 
2d790 20 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   Return a negati
2d7a0 76 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20  ve number if no 
2d7b0 65 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72  estimate is curr
2d7c0 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61  ently .** availa
2d7d0 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ble..*/.i64 sqli
2d7e0 74 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74  te3BtreeRowCount
2d7f0 45 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Est(BtCursor *pC
2d800 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  ur){.  i64 n;.  
2d810 75 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  u8 i;..  assert(
2d820 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2d830 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2d840 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d850 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2d860 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2d870 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  x) );..  /* Curr
2d880 65 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72  ently this inter
2d890 66 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  face is only cal
2d8a0 6c 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66  led by the OP_If
2d8b0 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63  Smaller.  ** opc
2d8c0 6f 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74  ode, and it that
2d8d0 20 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72   case the cursor
2d8e0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
2d8f0 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77  valid and.  ** w
2d900 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74  ill always point
2d910 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e   to a leaf node.
2d920 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2d930 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d940 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65  RSOR_VALID) ) re
2d950 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e  turn -1;.  if( N
2d960 45 56 45 52 28 70 43 75 72 2d 3e 61 70 50 61 67  EVER(pCur->apPag
2d970 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2d980 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72  leaf==0) ) retur
2d990 6e 20 2d 31 3b 0a 0a 20 20 66 6f 72 28 6e 3d 31  n -1;..  for(n=1
2d9a0 2c 20 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  , i=0; i<=pCur->
2d9b0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
2d9c0 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61   n *= pCur->apPa
2d9d0 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  ge[i]->nCell;.  
2d9e0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
2d9f0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2da00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2da10 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2da20 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2da30 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2da40 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2da50 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2da60 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2da70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2da80 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2da90 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2daa0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2dab0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2dac0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2dad0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2dae0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2daf0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2db00 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2db10 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2db20 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2db30 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2db40 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2db50 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2db60 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2db70 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2db80 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2db90 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2dba0 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2dbb0 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2dbc0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2dbd0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2dbe0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2dbf0 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2dc00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2dc10 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2dc20 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2dc30 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2dc40 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2dc50 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2dc60 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2dc70 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2dc80 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2dc90 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2dca0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2dcb0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2dcc0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2dcd0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2dce0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2dcf0 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2dd00 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2dd10 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2dd20 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2dd30 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2dd40 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2dd50 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2dd60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2dd70 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2dd80 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2dd90 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2dda0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2ddb0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2ddc0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2ddd0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dde0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2ddf0 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2de00 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2de10 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2de20 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2de30 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2de40 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2de50 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2de60 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2de70 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2de80 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2de90 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2dea0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2deb0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2dec0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ded0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2dee0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2def0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2df00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2df10 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2df20 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2df30 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2df40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2df50 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2df60 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2df70 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2df80 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2df90 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2dfa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2dfb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2dfd0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2dfe0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2dff0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2e000 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2e010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e020 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2e030 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e040 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2e060 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2e070 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2e080 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2e090 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2e0a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2e0b0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2e0c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2e0d0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2e0e0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e100 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e110 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2e120 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2e130 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2e140 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e150 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2e160 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20  = ++pCur->ix;.  
2e170 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2e180 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2e190 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2e1a0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2e1b0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2e1c0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2e1d0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2e1e0 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2e1f0 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2e200 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2e210 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2e220 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2e230 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2e240 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2e250 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2e260 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2e270 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2e280 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2e290 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2e2a0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2e2b0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2e2c0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2e2d0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2e2e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2e2f0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2e300 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2e310 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e320 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e330 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e340 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2e350 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2e360 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2e370 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2e380 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e390 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e3a0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2e3b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2e3c0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2e3d0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2e3e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2e3f0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2e400 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2e410 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2e420 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2e440 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2e450 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2e460 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2e470 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e480 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2e490 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67  ( pCur->ix>=pPag
2e4a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2e4b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e4c0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2e4d0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2e4e0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2e4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e510 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2e520 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2e530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e540 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2e550 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2e560 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2e570 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2e580 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2e590 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e5a0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2e5b0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2e5c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2e5d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2e5e0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2e5f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2e600 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2e610 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2e620 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e630 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2e640 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e650 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2e660 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2e670 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e680 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2e690 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2e6a0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e6b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2e6c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2e6d0 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2e6e0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2e6f0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2e700 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e710 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2e720 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d  Cur->ix)>=pPage-
2e730 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2e740 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65  ur->ix--;.    re
2e750 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2e760 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2e770 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2e780 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2e790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2e7a0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2e7b0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2e7c0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2e7d0 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2e7e0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2e7f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2e800 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2e810 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2e820 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2e830 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2e840 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2e850 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2e860 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2e870 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2e880 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2e890 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2e8a0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2e8b0 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2e8c0 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2e8d0 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2e8e0 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2e8f0 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2e900 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2e910 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2e920 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2e930 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2e940 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2e950 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2e960 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2e970 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2e980 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2e990 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2e9a0 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2e9b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2e9c0 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2e9d0 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2e9e0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2e9f0 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2ea00 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2ea10 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2ea20 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2ea30 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2ea40 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2ea50 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2ea60 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2ea70 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2ea80 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2ea90 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2eaa0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2eab0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2eac0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2ead0 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2eae0 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2eaf0 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2eb00 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2eb10 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2eb20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2eb30 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2eb40 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2eb50 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2eb60 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2eb70 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2eb80 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2eb90 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2eba0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2ebb0 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2ebc0 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2ebd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2ebe0 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2ebf0 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2ec00 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2ec10 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2ec20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2ec30 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2ec40 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2ec50 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2ec60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ec70 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2ec80 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2ec90 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2eca0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ecb0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ecc0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2ecd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2ece0 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2ecf0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2ed00 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2ed10 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ed20 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2ed30 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2ed40 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2ed50 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2ed60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2ed70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ed80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2ed90 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2eda0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2edb0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2edc0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2edd0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2ede0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2edf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ee00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ee10 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2ee20 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2ee30 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2ee40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2ee50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ee60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2ee70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2ee80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ee90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2eea0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2eeb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2eec0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2eed0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2eee0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2eef0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2ef00 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2ef10 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2ef20 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2ef30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ef40 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2ef50 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2ef60 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2ef70 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2ef80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2ef90 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2efa0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2efb0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2efc0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2efd0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
2efe0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2eff0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2f000 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2f010 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2f020 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2f030 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2f040 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2f050 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2f060 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2f070 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
2f080 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2f090 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2f0a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2f0b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2f0c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2f0d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2f0e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2f0f0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2f100 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2f110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2f120 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2f130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f140 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2f150 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  & (BTCF_ValidOvf
2f160 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
2f170 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70  Cur->ix--;.    p
2f180 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2f190 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2f1a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2f1b0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2f1c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f1d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2f1e0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2f1f0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2f200 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2f210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2f220 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2f230 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2f240 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2f250 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2f260 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28  pRes){.  assert(
2f270 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2f280 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2f290 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2f2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2f2b0 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2f2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f2d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f2e0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f2f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f300 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2f310 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2f320 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2f330 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2f340 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
2f350 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2f360 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
2f370 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2f380 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
2f390 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c  Cur->ix==0.   ||
2f3a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2f3b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2f3c0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
2f3d0 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
2f3e0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2f3f0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b   }.  pCur->ix--;
2f400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2f410 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
2f420 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44 49  QLITE_SERVER_EDI
2f430 54 49 4f 4e 0a 0a 23 64 65 66 69 6e 65 20 53 45  TION..#define SE
2f440 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45  RVER_DEFAULT_FRE
2f450 45 4c 49 53 54 53 20 20 20 20 20 20 31 36 0a 23  ELISTS      16.#
2f460 64 65 66 69 6e 65 20 53 45 52 56 45 52 5f 44 45  define SERVER_DE
2f470 46 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 5f 53  FAULT_FREELIST_S
2f480 49 5a 45 20 31 32 38 0a 0a 2f 2a 0a 2a 2a 20 41  IZE 128../*.** A
2f490 6c 6c 6f 63 61 74 65 20 74 68 65 20 66 72 65 65  llocate the free
2f4a0 2d 6e 6f 64 65 20 61 6e 64 20 74 68 65 20 66 69  -node and the fi
2f4b0 72 73 74 20 53 45 52 56 45 52 5f 44 45 46 41 55  rst SERVER_DEFAU
2f4c0 4c 54 5f 46 52 45 45 4c 49 53 54 53 20 0a 2a 2a  LT_FREELISTS .**
2f4d0 20 74 72 75 6e 6b 20 70 61 67 65 73 2e 0a 2a 2f   trunk pages..*/
2f4e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
2f4f0 63 61 74 65 53 65 72 76 65 72 46 72 65 65 6e 6f  cateServerFreeno
2f500 64 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  de(BtShared *pBt
2f510 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2f520 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
2f530 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 0a 20   pBt->pPage1;.. 
2f540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f550 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f560 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2f570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f580 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 6f  .    Pgno pgnoNo
2f590 64 65 20 3d 20 28 2b 2b 70 42 74 2d 3e 6e 50 61  de = (++pBt->nPa
2f5a0 67 65 29 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ge);.    MemPage
2f5b0 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *pNode = 0;.   
2f5c0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 70 75 74   int i;..    put
2f5d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2f5e0 44 61 74 61 5b 33 32 5d 2c 20 70 67 6e 6f 4e 6f  Data[32], pgnoNo
2f5f0 64 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  de);.    rc = bt
2f600 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2f610 28 70 42 74 2c 20 70 67 6e 6f 4e 6f 64 65 2c 20  (pBt, pgnoNode, 
2f620 26 70 4e 6f 64 65 2c 20 50 41 47 45 52 5f 47 45  &pNode, PAGER_GE
2f630 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 20 20  T_NOCONTENT);.  
2f640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2f660 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f670 69 74 65 28 70 4e 6f 64 65 2d 3e 70 44 62 50 61  ite(pNode->pDbPa
2f680 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2f690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f6a0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2f6b0 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61  te(&pNode->aData
2f6c0 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  [0], 0);.      p
2f6d0 75 74 34 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e  ut4byte(&pNode->
2f6e0 61 44 61 74 61 5b 34 5d 2c 20 53 45 52 56 45 52  aData[4], SERVER
2f6f0 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49 53  _DEFAULT_FREELIS
2f700 54 53 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  TS);.    }.    f
2f710 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
2f720 54 45 5f 4f 4b 20 26 26 20 69 3c 53 45 52 56 45  TE_OK && i<SERVE
2f730 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49  R_DEFAULT_FREELI
2f740 53 54 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  STS; i++){.     
2f750 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2f760 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 67 6e 6f   = 0;.      Pgno
2f770 20 70 67 6e 6f 54 72 75 6e 6b 3b 0a 20 20 20 20   pgnoTrunk;.    
2f780 20 20 69 66 28 20 2b 2b 70 42 74 2d 3e 6e 50 61    if( ++pBt->nPa
2f790 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2f7a0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
2f7b0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
2f7c0 20 70 67 6e 6f 54 72 75 6e 6b 20 3d 20 70 42 74   pgnoTrunk = pBt
2f7d0 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20  ->nPage;..      
2f7e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2f7f0 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 67 6e  sedPage(pBt, pgn
2f800 6f 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  oTrunk, &pTrunk,
2f810 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
2f820 54 45 4e 54 29 3b 0a 20 20 20 20 20 20 69 66 28  TENT);.      if(
2f830 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f840 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2f850 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f860 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2f870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
2f8a0 6d 73 65 74 28 70 54 72 75 6e 6b 2d 3e 61 44 61  mset(pTrunk->aDa
2f8b0 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20  ta, 0, 8);.     
2f8c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 6f     put4byte(&pNo
2f8d0 64 65 2d 3e 61 44 61 74 61 5b 38 2b 69 2a 34 5d  de->aData[8+i*4]
2f8e0 2c 20 70 67 6e 6f 54 72 75 6e 6b 29 3b 0a 20 20  , pgnoTrunk);.  
2f8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
2f900 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2f910 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
2f920 73 65 50 61 67 65 28 70 4e 6f 64 65 29 3b 0a 20  sePage(pNode);. 
2f930 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2f940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2f950 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2f960 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
2f970 70 61 67 65 20 69 6e 20 6f 6e 65 20 6f 66 20 74  page in one of t
2f980 68 65 20 64 61 74 61 62 61 73 65 20 66 72 65 65  he database free
2f990 2d 6c 69 73 74 73 2e 0a 2a 2a 20 41 6c 6c 6f 63  -lists..** Alloc
2f9a0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
2f9b0 20 66 72 65 65 2d 6c 69 73 74 73 20 69 66 20 72   free-lists if r
2f9c0 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
2f9d0 69 63 20 69 6e 74 20 66 69 6e 64 53 65 72 76 65  ic int findServe
2f9e0 72 54 72 75 6e 6b 28 42 74 53 68 61 72 65 64 20  rTrunk(BtShared 
2f9f0 2a 70 42 74 2c 20 69 6e 74 20 62 41 6c 6c 6f 63  *pBt, int bAlloc
2fa00 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 54 72  , MemPage **ppTr
2fa10 75 6e 6b 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  unk){.  MemPage 
2fa20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2fa30 50 61 67 65 31 3b 0a 20 20 4d 65 6d 50 61 67 65  Page1;.  MemPage
2fa40 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 20 20 20 20   *pNode = 0;    
2fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2fa60 6e 6f 64 65 20 70 61 67 65 20 2a 2f 0a 20 20 4d  node page */.  M
2fa70 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2fa80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2fa90 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
2faa0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 4e  age */.  Pgno iN
2fab0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2fad0 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 64 65 20   number of node 
2fae0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2faf0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2fb00 20 2f 2a 20 49 66 20 74 68 65 20 6e 6f 64 65 20   /* If the node 
2fb10 70 61 67 65 20 61 6e 64 20 66 72 65 65 2d 6c 69  page and free-li
2fb20 73 74 20 74 72 75 6e 6b 73 20 68 61 76 65 20 6e  st trunks have n
2fb30 6f 74 20 79 65 74 20 62 65 65 6e 20 61 6c 6c 6f  ot yet been allo
2fb40 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 0a  cated, allocate.
2fb50 20 20 2a 2a 20 74 68 65 6d 20 6e 6f 77 2e 20 20    ** them now.  
2fb60 2a 2f 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  */.  pPage1 = pB
2fb70 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69 4e 6f  t->pPage1;.  iNo
2fb80 64 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  de = get4byte(&p
2fb90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2fba0 29 3b 0a 20 20 69 66 28 20 69 4e 6f 64 65 3d 3d  );.  if( iNode==
2fbb0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  0 ){.    rc = al
2fbc0 6c 6f 63 61 74 65 53 65 72 76 65 72 46 72 65 65  locateServerFree
2fbd0 6e 6f 64 65 28 70 42 74 29 3b 0a 20 20 20 20 69  node(pBt);.    i
2fbe0 4e 6f 64 65 20 3d 20 67 65 74 34 62 79 74 65 28  Node = get4byte(
2fbf0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2fc00 32 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  2]);.  }..  /* G
2fc10 72 61 62 20 74 68 65 20 6e 6f 64 65 20 70 61 67  rab the node pag
2fc20 65 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  e */.  if( rc==S
2fc30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fc40 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2fc50 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 6f  sedPage(pBt, iNo
2fc60 64 65 2c 20 26 70 4e 6f 64 65 2c 20 30 29 3b 0a  de, &pNode, 0);.
2fc70 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2fc80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2fc90 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fcb0 4e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  Number of free-l
2fcc0 69 73 74 73 20 69 6e 20 74 68 69 73 20 64 62 20  ists in this db 
2fcd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  */.    int i;.. 
2fce0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 6c 6f 63     /* Try to loc
2fcf0 6b 20 61 20 66 72 65 65 2d 6c 69 73 74 20 74 72  k a free-list tr
2fd00 75 6e 6b 2e 20 49 66 20 62 41 6c 6c 6f 63 20 69  unk. If bAlloc i
2fd10 73 20 74 72 75 65 2c 20 69 74 20 68 61 73 20 74  s true, it has t
2fd20 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 66 72  o be a.    ** fr
2fd30 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 77 69  ee-list trunk wi
2fd40 74 68 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  th at least one 
2fd50 65 6e 74 72 79 20 69 6e 20 74 68 65 20 66 72 65  entry in the fre
2fd60 65 2d 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 6e  e-list. */.    n
2fd70 4c 69 73 74 20 3d 20 28 69 6e 74 29 67 65 74 34  List = (int)get4
2fd80 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61  byte(&pNode->aDa
2fd90 74 61 5b 34 5d 29 3b 0a 20 20 20 20 66 6f 72 28  ta[4]);.    for(
2fda0 69 3d 30 3b 20 69 3c 6e 4c 69 73 74 3b 20 69 2b  i=0; i<nList; i+
2fdb0 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  +){.      Pgno i
2fdc0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2fdd0 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 38  (&pNode->aData[8
2fde0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  +i*4]);.      if
2fdf0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  ( SQLITE_OK==sql
2fe00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 6c 6f  ite3PagerWritelo
2fe10 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ck(pBt->pPager, 
2fe20 69 54 72 75 6e 6b 29 20 29 7b 0a 20 20 20 20 20  iTrunk) ){.     
2fe30 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2fe40 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2fe50 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2fe60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2fe70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2fe80 26 20 62 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  & bAlloc ){.    
2fe90 20 20 20 20 20 20 69 66 28 20 21 67 65 74 34 62        if( !get4b
2fea0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2feb0 74 61 5b 30 5d 29 20 26 26 20 21 67 65 74 34 62  ta[0]) && !get4b
2fec0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2fed0 74 61 5b 34 5d 29 20 29 7b 0a 20 20 20 20 20 20  ta[4]) ){.      
2fee0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2fef0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  e(pTrunk);.     
2ff00 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2ff10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
2ff20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ff30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ff40 4f 4b 20 7c 7c 20 70 54 72 75 6e 6b 20 29 20 62  OK || pTrunk ) b
2ff50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ff60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66    }..    /* No f
2ff70 72 65 65 20 70 61 67 65 73 20 69 6e 20 61 6e 79  ree pages in any
2ff80 20 66 72 65 65 2d 6c 69 73 74 2e 20 4f 72 20 70   free-list. Or p
2ff90 65 72 68 61 70 73 20 77 65 20 77 65 72 65 20 6c  erhaps we were l
2ffa0 6f 63 6b 65 64 20 6f 75 74 2e 20 49 6e 20 0a 20  ocked out. In . 
2ffb0 20 20 20 2a 2a 20 65 69 74 68 65 72 20 63 61 73     ** either cas
2ffc0 65 2c 20 74 72 79 20 74 6f 20 61 6c 6c 6f 63 61  e, try to alloca
2ffd0 74 65 20 6d 6f 72 65 20 66 72 6f 6d 20 74 68 65  te more from the
2ffe0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2fff0 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66   now.  */.    if
30000 28 20 69 3d 3d 6e 4c 69 73 74 20 29 7b 0a 20 20  ( i==nList ){.  
30010 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
30020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 54 72  SQLITE_OK && pTr
30030 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
30040 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30050 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
30060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 66  DbPage);.      f
30070 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
30080 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4c 69 73 74  TE_OK && i<nList
30090 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
300a0 2f 2a 20 41 64 64 20 73 6f 6d 65 20 66 72 65 65  /* Add some free
300b0 20 70 61 67 65 73 20 74 6f 20 65 61 63 68 20 66   pages to each f
300c0 72 65 65 2d 6c 69 73 74 2e 20 4e 6f 20 73 65 72  ree-list. No ser
300d0 76 65 72 2d 6c 6f 63 6b 73 20 61 72 65 20 72 65  ver-locks are re
300e0 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
300f0 2a 20 74 6f 20 64 6f 20 74 68 69 73 20 61 73 20  * to do this as 
30100 77 65 20 68 61 76 65 20 61 20 77 72 69 74 65 2d  we have a write-
30110 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20 2d  lock on page 1 -
30120 20 67 75 61 72 61 6e 74 65 65 69 6e 67 0a 20 20   guaranteeing.  
30130 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
30140 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
30150 20 64 62 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20   db file.  */.  
30160 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
30170 54 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  T = 0;.        P
30180 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 67 65 74  gno iTrunk = get
30190 34 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44  4byte(&pNode->aD
301a0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
301b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
301c0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
301d0 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 2c 20 30  , iTrunk, &pT, 0
301e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
301f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30200 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30210 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30220 28 70 54 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  (pT->pDbPage);. 
30230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30260 69 6e 74 20 69 50 67 20 3d 20 67 65 74 34 62 79  int iPg = get4by
30270 74 65 28 26 70 54 2d 3e 61 44 61 74 61 5b 34 5d  te(&pT->aData[4]
30280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
30290 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 50 67 3c  (/*no-op*/; iPg<
302a0 53 45 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46  SERVER_DEFAULT_F
302b0 52 45 45 4c 49 53 54 5f 53 49 5a 45 3b 20 69 50  REELIST_SIZE; iP
302c0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
302d0 20 20 69 66 28 20 2b 2b 70 42 74 2d 3e 6e 50 61    if( ++pBt->nPa
302e0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
302f0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
30300 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
30310 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30320 26 70 54 2d 3e 61 44 61 74 61 5b 38 2b 69 50 67  &pT->aData[8+iPg
30330 2a 34 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  *4], pBt->nPage)
30340 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30350 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
30360 28 26 70 54 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  (&pT->aData[4], 
30370 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iPg);.          
30380 69 66 28 20 70 54 72 75 6e 6b 3d 3d 30 20 29 7b  if( pTrunk==0 ){
30390 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54 72  .            pTr
303a0 75 6e 6b 20 3d 20 70 54 3b 0a 20 20 20 20 20 20  unk = pT;.      
303b0 20 20 20 20 20 20 70 54 20 3d 20 30 3b 0a 20 20        pT = 0;.  
303c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
303d0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
303e0 61 73 65 50 61 67 65 28 70 54 29 3b 0a 20 20 20  asePage(pT);.   
303f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
30400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30410 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
30420 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20  *pLast = 0;.    
30430 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30440 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30450 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 4c   pBt->nPage, &pL
30460 61 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ast, 0);.       
30470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
304a0 72 57 72 69 74 65 28 70 4c 61 73 74 2d 3e 70 44  rWrite(pLast->pD
304b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
304c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
304d0 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ast);.          
304e0 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
304f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
30500 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
30510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
30530 6c 65 61 73 65 50 61 67 65 28 70 4e 6f 64 65 29  leasePage(pNode)
30540 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
30550 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
30560 65 72 74 28 20 70 54 72 75 6e 6b 20 29 3b 0a 20  ert( pTrunk );. 
30570 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30580 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
30590 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
305a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
305b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  _OK ){.    relea
305c0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
305d0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
305e0 20 20 7d 0a 20 20 2a 70 70 54 72 75 6e 6b 20 3d    }.  *ppTrunk =
305f0 20 70 54 72 75 6e 6b 3b 0a 20 20 72 65 74 75 72   pTrunk;.  retur
30600 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
30610 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 65 72 76  int allocateServ
30620 65 72 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  erPage(.  BtShar
30630 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
30640 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
30650 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
30660 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
30670 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
30680 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
30690 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
306a0 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
306b0 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
306c0 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
306d0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
306e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
306f0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
30700 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
30710 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
30720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
30730 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
30740 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
30750 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
30760 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30780 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30790 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
307a0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
307b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20      /* The node 
307c0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
307d0 67 6e 6f 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61  gnoNew = 0;..  a
307e0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
307f0 41 4c 4c 4f 43 5f 41 4e 59 20 29 3b 0a 20 20 61  ALLOC_ANY );.  a
30800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
30810 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
30820 75 74 65 78 29 20 29 3b 0a 0a 20 20 72 63 20 3d  utex) );..  rc =
30830 20 66 69 6e 64 53 65 72 76 65 72 54 72 75 6e 6b   findServerTrunk
30840 28 70 42 74 2c 20 31 2c 20 26 70 54 72 75 6e 6b  (pBt, 1, &pTrunk
30850 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
30860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
30870 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
30880 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30890 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 6f 6e  of free pages on
308a0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
308b0 20 2a 2f 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   */.    nFree = 
308c0 28 69 6e 74 29 67 65 74 34 62 79 74 65 28 26 70  (int)get4byte(&p
308d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
308e0 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3d  ;.    if( nFree=
308f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  =0 ){.      pgno
30900 4e 65 77 20 3d 20 67 65 74 34 62 79 74 65 28 26  New = get4byte(&
30910 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30930 20 70 67 6e 6f 4e 65 77 20 29 3b 0a 20 20 20 20   pgnoNew );.    
30940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 46 72  }else{.      nFr
30950 65 65 2d 2d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  ee--;.      pgno
30960 4e 65 77 20 3d 20 67 65 74 34 62 79 74 65 28 26  New = get4byte(&
30970 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
30980 34 2a 6e 46 72 65 65 5d 29 3b 0a 20 20 20 20 20  4*nFree]);.     
30990 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
309a0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 28 75 33  k->aData[4], (u3
309b0 32 29 6e 46 72 65 65 29 3b 0a 20 20 20 20 20 20  2)nFree);.      
309c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
309d0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 54 72 75 6e  nk);.      pTrun
309e0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  k = 0;.    }.  }
309f0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
30a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 4d 65 6d  TE_OK ){.    Mem
30a10 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  Page *pNew = 0;.
30a20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30a30 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30a40 20 70 67 6e 6f 4e 65 77 2c 20 26 70 4e 65 77 2c   pgnoNew, &pNew,
30a50 20 70 54 72 75 6e 6b 3f 30 3a 50 41 47 45 52 5f   pTrunk?0:PAGER_
30a60 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
30a70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
30a90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30aa0 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50  Write(pNew->pDbP
30ab0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
30ac0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30ad0 4b 20 26 26 20 70 54 72 75 6e 6b 20 29 7b 0a 20  K && pTrunk ){. 
30ae0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72 75       memcpy(pTru
30af0 6e 6b 2d 3e 61 44 61 74 61 2c 20 70 4e 65 77 2d  nk->aData, pNew-
30b00 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 75 73 61  >aData, pBt->usa
30b10 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  bleSize);.    }.
30b20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 4e      *ppPage = pN
30b30 65 77 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  ew;.    *pPgno =
30b40 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 7d 0a 0a 20   pgnoNew;.  }.. 
30b50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
30b60 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
30b70 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
30b80 20 66 72 65 65 53 65 72 76 65 72 50 61 67 65 32   freeServerPage2
30b90 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
30ba0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
30bb0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 69  Pgno iPage){.  i
30bc0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30be0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30bf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
30c00 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
30c10 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70     /* The node p
30c20 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
30c30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30c40 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
30c50 20 29 3b 0a 0a 20 20 72 63 20 3d 20 66 69 6e 64   );..  rc = find
30c60 53 65 72 76 65 72 54 72 75 6e 6b 28 70 42 74 2c  ServerTrunk(pBt,
30c70 20 30 2c 20 26 70 54 72 75 6e 6b 29 3b 0a 20 20   0, &pTrunk);.  
30c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30c90 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 46 72  K ){.    int nFr
30ca0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
30cb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
30cc0 65 65 20 70 61 67 65 73 20 6f 6e 20 74 68 69 73  ee pages on this
30cd0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
30ce0 20 20 20 6e 46 72 65 65 20 3d 20 28 69 6e 74 29     nFree = (int)
30cf0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
30d00 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
30d10 20 69 66 28 20 6e 46 72 65 65 3e 3d 28 28 70 42   if( nFree>=((pB
30d20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2f 20  t->usableSize / 
30d30 34 29 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  4) - 2) ){.     
30d40 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 7b   if( pPage==0 ){
30d50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
30d60 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30d70 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
30d80 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  age, 0);.      }
30d90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
30da0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
30db0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
30dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
30dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30de0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
30df0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30e00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30e10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
30e20 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54 72  Page->aData, pTr
30e30 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  unk->aData, pBt-
30e40 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
30e50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30e60 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30e70 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
30e80 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
30e90 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  nk->aData[4], 0)
30ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30eb0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30ec0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
30ed0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
30ee0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
30ef0 46 72 65 65 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Free*4], iPage);
30f00 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
30f10 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
30f20 5d 2c 20 28 75 33 32 29 6e 46 72 65 65 2b 31 29  ], (u32)nFree+1)
30f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
30f40 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
30f50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
30f60 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
30f70 66 69 6e 65 20 61 6c 6c 6f 63 61 74 65 53 65 72  fine allocateSer
30f80 76 65 72 50 61 67 65 28 76 2c 20 77 2c 20 78 2c  verPage(v, w, x,
30f90 20 79 2c 20 7a 29 20 53 51 4c 49 54 45 5f 4f 4b   y, z) SQLITE_OK
30fa0 0a 23 20 64 65 66 69 6e 65 20 66 72 65 65 53 65  .# define freeSe
30fb0 72 76 65 72 50 61 67 65 32 28 78 2c 20 79 2c 20  rverPage2(x, y, 
30fc0 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  z) SQLITE_OK.#en
30fd0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 45  dif /* SQLITE_SE
30fe0 52 56 45 52 5f 45 44 49 54 49 4f 4e 20 2a 2f 0a  RVER_EDITION */.
30ff0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
31000 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
31010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31020 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
31030 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
31040 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
31050 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
31060 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
31070 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
31080 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
31090 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
310a0 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
310b0 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
310c0 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
310d0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
310e0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
310f0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
31100 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
31110 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
31120 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
31130 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
31140 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
31150 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
31160 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
31170 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
31180 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
31190 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
311a0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
311b0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
311c0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
311d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
311e0 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
311f0 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
31200 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
31210 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
31220 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
31230 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
31240 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
31250 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
31260 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
31270 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
31280 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
31290 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
312a0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
312b0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
312c0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
312d0 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
312e0 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
312f0 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
31300 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
31310 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
31320 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
31330 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
31340 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
31350 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
31360 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
31370 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
31380 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
31390 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
313a0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
313b0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
313c0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
313d0 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
313e0 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
313f0 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
31400 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
31410 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
31420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
31430 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
31440 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
31450 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31460 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
31470 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
31480 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
31490 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
314a0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
314b0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
314c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
314d0 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
314e0 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
314f0 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
31500 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
31510 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
31520 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
31530 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
31540 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
31550 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
31560 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
31570 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
31580 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
31590 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
315a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
315b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
315c0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
315d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
315e0 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
315f0 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
31600 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
31610 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
31620 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
31630 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
31640 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
31650 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
31660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
31670 2f 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  /..  if( sqlite3
31680 50 61 67 65 72 49 73 53 65 72 76 65 72 28 70 42  PagerIsServer(pB
31690 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
316a0 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f 63 61 74    return allocat
316b0 65 53 65 72 76 65 72 50 61 67 65 28 70 42 74 2c  eServerPage(pBt,
316c0 20 70 70 50 61 67 65 2c 20 70 50 67 6e 6f 2c 20   ppPage, pPgno, 
316d0 6e 65 61 72 62 79 2c 20 65 4d 6f 64 65 29 3b 20  nearby, eMode); 
316e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
316f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31700 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31710 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
31720 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
31730 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
31740 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
31750 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
31760 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
31770 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
31780 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
31790 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
317a0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
317b0 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
317c0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
317d0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
317e0 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
317f0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
31800 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31810 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
31820 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
31830 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31840 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
31850 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
31860 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
31870 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
31880 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31890 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
318a0 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
318b0 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
318c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
318d0 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
318e0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
318f0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
31900 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
31910 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
31920 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
31930 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
31940 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33  earby' */.    u3
31950 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20  2 nSearch = 0;  
31960 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65   /* Count of the
31970 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63   number of searc
31980 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20  h attempts */.  
31990 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f    .    /* If eMo
319a0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
319b0 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66  T and a query of
319c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
319d0 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68  .    ** shows th
319e0 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  at the page 'nea
319f0 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72  rby' is somewher
31a00 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
31a10 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  st, then.    ** 
31a20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20  the entire-list 
31a30 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64  will be searched
31a40 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a   for that page..
31a50 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
31a60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31a70 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d  ACUUM.    if( eM
31a80 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
31a90 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CT ){.      if( 
31aa0 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
31ab0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
31ac0 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  pe;.        asse
31ad0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
31ae0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
31b00 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31b10 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
31b20 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
31b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31b40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31b50 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65         if( eType
31b60 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
31b70 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
31b80 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
31b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31ba0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
31bb0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
31bc0 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68   ){.      search
31bd0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  List = 1;.    }.
31be0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
31bf0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
31c00 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
31c10 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
31c20 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
31c30 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
31c40 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
31c50 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
31c60 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
31c70 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31c80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31c90 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
31ca0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
31cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31cc0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31cd0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
31ce0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
31cf0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
31d00 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
31d10 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
31d20 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
31d30 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
31d40 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
31d50 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
31d60 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
31d70 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
31d80 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
31d90 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
31da0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
31db0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
31dc0 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75  ACT).    ** or u
31dd0 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73  ntil a page less
31de0 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69   than 'nearby' i
31df0 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
31e00 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20  ==BTALLOC_LT).  
31e10 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
31e20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
31e30 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
31e40 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
31e50 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
31e60 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36  ENCE-OF: R-01506
31e70 2d 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74  -11053 The first
31e80 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
31e90 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
31ea0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  e.        ** is 
31eb0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31ec0 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
31ed0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
31ee0 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20  in the list or. 
31ef0 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69         ** zero i
31f00 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61  f this is the la
31f10 73 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  st freelist trun
31f20 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  k page. */.     
31f30 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
31f40 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
31f50 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
31f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31f70 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
31f80 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20  : R-59841-13798 
31f90 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65  The 4-byte big-e
31fa0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74  ndian integer at
31fb0 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20   offset 32.     
31fc0 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65     ** stores the
31fd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
31fe0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
31ff0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  f the freelist, 
32000 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20  or zero if.     
32010 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69     ** the freeli
32020 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  st is empty. */.
32030 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
32040 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32050 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
32060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
32070 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
32080 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
32090 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
320a0 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20   || nSearch++ > 
320b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
320c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
320d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
320e0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
320f0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32100 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
32110 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
32120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32130 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
32140 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
32150 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
32160 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
32170 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
32180 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
32190 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
321a0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20  k->aData!=0 );. 
321b0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
321c0 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33  -OF: R-13523-043
321d0 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e  94 The second in
321e0 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
321f0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
32200 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e       ** is the n
32210 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
32220 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ge pointers to f
32230 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20  ollow. */.      
32240 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
32250 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
32260 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
32270 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
32280 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
32290 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
322a0 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
322b0 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
322c0 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
322d0 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
322e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
322f0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
32300 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
32310 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
32320 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
32330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
32340 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
32350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32360 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32370 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32380 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32390 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
323a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
323b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
323c0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
323d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
323e0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
323f0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
32400 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32410 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32420 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32430 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
32440 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
32450 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
32460 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
32470 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
32480 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
32490 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
324a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
324b0 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
324c0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
324d0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
324e0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
324f0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
32500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32510 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
32520 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32530 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
32540 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32550 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32560 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
32570 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
32580 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
32590 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
325a0 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
325b0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
325c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
325d0 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
325e0 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
325f0 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
32600 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
32610 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
32620 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
32630 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
32640 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
32650 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
32660 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
32670 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
32680 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32690 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
326a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
326b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
326c0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
326d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
326e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
326f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32700 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32710 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
32720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
32730 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
32740 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
32750 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
32760 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
32770 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32780 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32790 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
327a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
327b0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
327c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
327d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
327e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
327f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32800 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32810 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32820 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32830 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
32840 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
32850 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
32860 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32880 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
32890 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
328a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
328b0 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
328c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
328d0 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
328e0 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
328f0 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
32900 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
32910 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
32920 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
32930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32940 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
32950 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
32960 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
32970 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
32980 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
32990 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
329a0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
329b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
329c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
329d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
329e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
329f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32a10 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
32a20 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
32a30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
32a40 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
32a50 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
32a60 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
32a70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
32aa0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
32ab0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
32ac0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32ae0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
32af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32b10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32b20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
32b30 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
32b40 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32b50 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32b70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
32b80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32b90 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
32ba0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
32bb0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
32bc0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
32bd0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
32be0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
32bf0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
32c00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
32c10 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
32c20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32c30 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
32c40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
32c50 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
32c60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
32c70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32c80 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
32c90 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
32ca0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32cb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32cc0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
32cd0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
32ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32cf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32d00 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
32d10 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
32d20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
32d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
32d40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32d50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32d60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
32d70 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
32d80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
32d90 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
32da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32db0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
32dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
32dd0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
32de0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
32df0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
32e00 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
32e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
32e20 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
32e30 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
32e40 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
32e50 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
32e60 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
32e70 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
32e80 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
32e90 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
32ea0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
32eb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
32ec0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
32ed0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
32ee0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
32ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
32f00 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
32f10 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
32f20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
32f30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
32f40 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
32f50 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
32f60 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
32f70 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
32f80 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
32f90 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
32fa0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
32fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
32fc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32fd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ff0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
33000 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33010 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
33020 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
33030 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
33040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
33050 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
33060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
33070 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
33080 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
33090 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
330a0 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
330b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
330c0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
330d0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
330e0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
330f0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
33100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33110 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33140 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
33150 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
33160 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
33170 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
33180 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
33190 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
331a0 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
331b0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
331c0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
331d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
331e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
331f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33200 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33220 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
33230 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
33240 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
33250 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
33260 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
33270 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
33280 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
33290 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
332a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
332b0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
332c0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
332d0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
332e0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
332f0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
33300 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
33310 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
33320 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
33330 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
33340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33350 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
33360 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
33370 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
33380 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33390 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
333a0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
333b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
333c0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
333d0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
333e0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
333f0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
33400 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
33410 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
33420 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
33430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
33440 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
33450 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
33460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
33470 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
33480 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
33490 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
334a0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
334b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
334c0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
334d0 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
334e0 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
334f0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
33500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
33530 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
33540 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
33550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
33560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
33580 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
33590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
335a0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
335b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
335c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
335d0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
335e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
335f0 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
33600 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
33610 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
33620 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
33630 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
33640 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33650 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
33660 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
33670 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
33680 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
33690 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
336a0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
336b0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
336c0 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
336d0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
336e0 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
336f0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
33700 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
33710 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
33720 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
33730 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
33740 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
33750 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
33760 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
33770 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
33780 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
33790 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
337a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
337b0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
337c0 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
337d0 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
337e0 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
337f0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
33800 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
33810 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
33820 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
33830 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
33840 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
33850 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
33860 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
33870 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
33880 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
33890 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
338a0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
338b0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
338c0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
338d0 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
338e0 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
338f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
33900 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
33910 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
33920 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
33930 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
33940 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
33950 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
33960 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
33970 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
33980 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
33990 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
339a0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
339b0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
339c0 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
339d0 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
339e0 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
339f0 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
33a00 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
33a10 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
33a20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33a30 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
33a40 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
33a50 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
33a60 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
33a70 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
33a80 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
33a90 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
33aa0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
33ab0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33ac0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
33ad0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
33ae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
33b00 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
33b10 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
33b20 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
33b30 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
33b40 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
33b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33b60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33b70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33b80 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
33b90 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33ba0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33bb0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
33bc0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
33bd0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
33be0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
33bf0 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
33c00 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
33c10 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
33c20 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
33c30 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
33c40 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
33c50 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
33c60 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
33c70 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
33c80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33c90 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
33ca0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
33cb0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
33cc0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
33cd0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
33ce0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
33cf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33d00 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
33d10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33d20 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
33d30 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
33d40 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
33d50 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
33d60 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
33d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33d80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33da0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
33db0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
33dc0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
33dd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33de0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33df0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
33e00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
33e10 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
33e20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
33e30 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
33e40 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
33e50 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
33e60 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
33e70 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
33e80 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
33e90 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
33ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
33eb0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
33ec0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
33ed0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
33ee0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
33ef0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
33f00 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
33f10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
33f20 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
33f30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33f40 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
33f50 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
33f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33f70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33f80 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
33f90 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
33fa0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
33fb0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
33fc0 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
33fd0 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
33fe0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
33ff0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
34000 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
34010 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
34020 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34030 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
34040 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
34050 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
34060 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
34070 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
34080 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
34090 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
340a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
340b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
340c0 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
340d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
340e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
340f0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
34100 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
34110 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34120 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
34130 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
34140 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
34150 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
34160 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
34170 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
34180 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
34190 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
341a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
341b0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
341c0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
341d0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
341e0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
341f0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
34200 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
34210 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
34220 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
34230 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
34240 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
34250 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
34260 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
34270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
34280 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
34290 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
342a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
342b0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
342c0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
342d0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
342e0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
342f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
34300 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
34310 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
34320 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
34330 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
34340 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
34350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34360 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
34370 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
34380 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
34390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343a0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
343b0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
343c0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
343d0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
343e0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
343f0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
34400 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
34410 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
34420 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
34430 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34440 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
34450 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
34460 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
34490 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
344a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
344b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
344c0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
344d0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
344e0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
344f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
34500 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
34510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
34520 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
34530 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
34540 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
34550 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
34560 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
34570 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
34580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34590 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
345a0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
345b0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
345c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
345d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
345e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
345f0 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
34600 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
34610 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  ;.  }..  if( pBt
34620 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
34630 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
34640 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
34650 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
34660 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
34670 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
34680 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
34690 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
346a0 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
346b0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
346c0 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
346d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
346e0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
346f0 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
34700 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
34710 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
34720 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
34730 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
34740 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
34750 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34760 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
34770 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
34780 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
34790 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
347a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61  .  if( sqlite3Pa
347b0 67 65 72 49 73 53 65 72 76 65 72 28 70 42 74 2d  gerIsServer(pBt-
347c0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
347d0 72 63 20 3d 20 66 72 65 65 53 65 72 76 65 72 50  rc = freeServerP
347e0 61 67 65 32 28 70 42 74 2c 20 70 50 61 67 65 2c  age2(pBt, pPage,
347f0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74   iPage);.    got
34800 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34810 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
34820 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
34830 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
34840 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
34850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34860 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
34870 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34880 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34890 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
348a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
348b0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
348c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
348d0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
348e0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
348f0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34900 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
34910 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
34920 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
34930 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
34940 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
34950 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
34960 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
34970 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34980 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
34990 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
349a0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
349b0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
349c0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
349d0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
349e0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
349f0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
34a00 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
34a10 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
34a20 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
34a30 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
34a40 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
34a50 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
34a60 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
34a70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
34a80 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
34a90 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
34aa0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
34ab0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
34ac0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
34ad0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
34ae0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
34af0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34b00 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
34b10 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
34b20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
34b30 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
34b40 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
34b50 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
34b60 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
34b70 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
34b80 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
34b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34ba0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
34bb0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
34bc0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
34bd0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
34be0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
34bf0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
34c00 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
34c10 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
34c20 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
34c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
34c50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34c60 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
34c70 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
34c80 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
34c90 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
34ca0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
34cb0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
34cc0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
34cd0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
34ce0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34cf0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34d00 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
34d10 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
34d20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
34d30 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
34d40 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
34d50 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
34d60 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
34d70 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
34d80 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
34d90 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
34da0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
34db0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
34dc0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
34dd0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
34de0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
34df0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
34e00 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
34e10 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
34e20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
34e30 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34e40 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
34e50 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
34e60 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
34e70 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
34e80 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
34e90 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
34ea0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
34eb0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
34ec0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34ed0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
34ee0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
34ef0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
34f00 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
34f10 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
34f20 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
34f30 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
34f40 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
34f50 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
34f60 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
34f70 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
34f80 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
34f90 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
34fa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
34fb0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
34fc0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
34fd0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
34fe0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
34ff0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
35000 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
35010 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
35020 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
35030 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
35040 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
35050 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
35060 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
35070 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
35080 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
35090 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
350a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
350b0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
350c0 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
350d0 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
350e0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
350f0 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
35100 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
35110 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
35120 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
35130 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
35140 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
35150 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
35160 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
35170 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
35180 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
35190 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
351a0 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
351b0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
351c0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
351d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
351e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
351f0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
35200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35210 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
35220 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
35230 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
35240 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
35250 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
35260 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
35270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
35280 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
35290 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
352a0 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
352b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
352c0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
352d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
352e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
352f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
35300 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
35310 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
35320 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
35330 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
35340 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
35350 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
35360 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
35370 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
35380 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
35390 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
353a0 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
353b0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
353c0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
353d0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
353e0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
353f0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
35400 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
35410 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
35420 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
35430 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
35440 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
35450 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
35460 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
35470 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
35480 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
35490 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
354a0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
354b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
354c0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
354d0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
354e0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
354f0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
35500 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
35510 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
35520 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
35530 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
35540 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
35550 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
35560 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
35570 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35580 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
35590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
355a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
355b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
355c0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
355d0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
355e0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
355f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
35600 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
35610 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
35620 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
35630 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
35640 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
35650 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
35660 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
35670 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
35680 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
35690 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
356a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
356b0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
356c0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
356d0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
356e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
356f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
35700 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
35710 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
35720 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
35730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
35740 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
35750 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
35760 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
35770 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
35780 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
35790 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
357a0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
357b0 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
357c0 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
357d0 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
357e0 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
357f0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
35800 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
35810 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
35820 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
35830 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
35840 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
35850 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35860 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
35870 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
35880 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
35890 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
358a0 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
358b0 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  l */.  CellInfo 
358c0 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20  *pInfo          
358d0 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74  /* Size informat
358e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
358f0 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ll */.){.  BtSha
35900 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
35910 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76  ->pBt;.  Pgno ov
35920 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
35930 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
35940 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
35950 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
35960 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35970 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35980 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
35990 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
359a0 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
359b0 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
359c0 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
359d0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
359e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
359f0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
35a00 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
35a10 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
35a20 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
35a30 20 70 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53   pCell+pInfo->nS
35a40 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
35a50 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
35a60 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
35a70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35a80 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
35a90 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
35aa0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
35ab0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
35ac0 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
35ad0 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
35ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
35af0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
35b00 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
35b10 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35b20 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
35b30 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
35b40 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
35b50 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
35b60 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
35b70 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
35b80 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
35b90 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
35ba0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
35bb0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
35bc0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35bd0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35be0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35bf0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35c00 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35c10 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35c20 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
35c30 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
35c40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
35c50 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
35c60 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
35c70 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
35c80 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
35c90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
35ca0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
35cb0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
35cc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35cd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35ce0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35cf0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35d00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35d10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35d20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
35d30 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
35d40 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
35d50 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
35d60 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
35d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
35d80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35d90 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
35da0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
35db0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
35dc0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
35dd0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
35de0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
35df0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
35e00 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
35e10 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
35e20 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
35e30 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
35e40 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
35e50 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
35e60 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
35e70 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
35e80 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
35e90 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
35ea0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
35eb0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
35ec0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
35ed0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
35ee0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
35ef0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
35f00 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
35f10 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
35f20 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
35f30 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
35f40 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
35f50 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
35f60 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
35f70 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
35f80 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
35f90 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
35fa0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
35fb0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
35fc0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
35fd0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
35fe0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
35ff0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
36000 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
36010 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
36020 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
36030 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
36040 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
36050 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
36060 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
36070 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
36080 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
36090 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
360a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
360b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
360c0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
360d0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
360e0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
360f0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
36100 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36110 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
36120 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
36130 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36140 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
36150 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
36160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
36180 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
36190 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
361a0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
361b0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
361c0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
361d0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
361e0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
361f0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
36200 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
36210 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
36220 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
36230 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
36240 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
36250 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
36260 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
36270 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
36280 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
36290 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
362a0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
362b0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
362c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
362d0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
362e0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
362f0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
36300 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
36310 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
36320 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
36330 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
36340 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
36350 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
36360 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
36370 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
36380 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
36390 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
363a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
363b0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
363c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
363d0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
363e0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
363f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
36400 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
36410 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
36420 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
36430 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
36440 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
36450 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
36460 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
36470 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
36480 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
36490 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
364a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
364b0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
364c0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
364d0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
364e0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
364f0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
36500 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
36510 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
36520 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
36530 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
36540 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
36550 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36560 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
36570 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
36580 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
36590 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
365a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
365b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
365c0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
365d0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
365e0 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
365f0 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
36600 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
36610 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
36620 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
36630 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
36640 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
36650 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
36660 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
36670 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
36680 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
36690 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
366a0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
366b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
366c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
366d0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
366e0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
366f0 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
36700 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
36710 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36720 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
36730 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
36740 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
36750 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
36760 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
36770 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
36780 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
36790 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
367a0 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
367b0 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
367c0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
367d0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
367e0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
367f0 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
36800 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
36810 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36820 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
36830 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36840 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
36850 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
36860 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
36870 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
36880 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
36890 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
368a0 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
368b0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
368c0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
368d0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
368e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
368f0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
36900 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  */.  if( nPayloa
36910 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
36920 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
36930 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
36940 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36950 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
36960 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
36970 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
36980 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
36990 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
369a0 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
369b0 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
369c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
369d0 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
369e0 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
369f0 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
36a00 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
36a10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36a20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
36a30 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
36a40 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
36a50 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
36a60 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
36a70 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
36a80 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
36a90 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
36aa0 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
36ab0 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
36ac0 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
36ad0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
36ae0 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
36af0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
36b00 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
36b10 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
36b20 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
36b30 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
36b40 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
36b50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
36b60 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
36b70 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
36b80 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
36b90 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
36ba0 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
36bb0 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
36bc0 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
36bd0 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
36be0 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
36bf0 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
36c00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
36c10 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
36c20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
36c30 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
36c40 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
36c50 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
36c60 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
36c70 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
36c80 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
36c90 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
36ca0 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
36cb0 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
36cc0 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
36cd0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
36ce0 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
36cf0 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
36d00 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
36d10 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
36d20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
36d30 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
36d40 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
36d50 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ly..  */.#ifdef 
36d60 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
36d70 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
36d80 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
36d90 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
36da0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
36db0 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
36dc0 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
36dd0 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
36de0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
36df0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
36e00 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
36e10 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
36e20 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
36e30 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
36e40 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
36e50 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
36e60 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
36e70 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
36e80 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
36e90 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
36ea0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
36eb0 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
36ec0 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
36ed0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
36ee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
36ef0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36f00 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
36f10 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
36f20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
36f30 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
36f40 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
36f50 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
36f60 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
36f70 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
36f80 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
36f90 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
36fa0 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
36fb0 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
36fc0 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
36fd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
36fe0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
36ff0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
37000 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
37010 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
37020 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
37030 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
37040 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
37050 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
37060 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
37070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
37080 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
37090 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
370a0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
370b0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
370c0 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
370d0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
370e0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
370f0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
37100 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
37110 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
37120 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
37130 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
37140 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
37150 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
37160 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
37170 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
37180 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
37190 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
371a0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
371b0 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
371c0 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
371d0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
371e0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
371f0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
37200 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
37210 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
37220 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
37230 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
37240 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
37250 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
37260 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
37270 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
37280 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
37290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
372a0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
372b0 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
372c0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
372d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
372e0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
372f0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
37300 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
37310 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
37320 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37330 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
37340 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
37350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
37360 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
37370 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
37380 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
37390 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
373a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
373b0 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
373c0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
373d0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
373e0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
373f0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
37400 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
37410 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
37420 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
37430 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
37440 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
37450 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
37460 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37470 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
37480 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
37490 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
374a0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
374b0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
374c0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
374d0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
374e0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
374f0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
37500 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
37510 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
37520 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
37530 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
37540 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
37550 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37560 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
37570 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
37580 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
37590 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
375a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
375b0 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
375c0 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
375d0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
375e0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
375f0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
37600 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
37610 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
37620 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
37630 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
37640 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
37650 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
37660 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
37670 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
37680 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
37690 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
376a0 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
376b0 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
376c0 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
376d0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
376e0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
376f0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
37700 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
37710 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
37720 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37730 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
37740 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37750 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
37760 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
37770 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
37780 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
37790 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
377a0 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
377b0 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
377c0 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
377d0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
377e0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
377f0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
37800 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
37810 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
37820 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
37830 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
37840 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37850 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37860 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
37870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
37880 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
37890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
378a0 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
378b0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
378c0 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
378d0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
378e0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
378f0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
37900 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
37910 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
37920 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
37930 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
37940 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
37950 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
37960 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
37970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
37990 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
379a0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
379b0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
379c0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
379d0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
379e0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
379f0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
37a00 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
37a10 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
37a20 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
37a30 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
37a40 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
37a50 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
37a60 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
37a70 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
37a80 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
37a90 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
37aa0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
37ab0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
37ac0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
37ad0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
37ae0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
37af0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
37b00 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
37b10 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
37b20 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
37b30 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37b40 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
37b50 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
37b60 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
37b70 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
37b80 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
37b90 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
37ba0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
37bb0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
37bc0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
37bd0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
37be0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
37bf0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
37c00 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
37c10 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
37c20 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
37c30 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
37c40 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
37c50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
37c60 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37c70 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
37c80 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
37c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37ca0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37cb0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37cc0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37cd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
37ce0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
37cf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
37d00 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
37d10 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
37d20 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
37d30 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
37d40 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
37d50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37d60 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37d70 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
37d80 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
37d90 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
37da0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37db0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
37dc0 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
37dd0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
37de0 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
37df0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37e00 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
37e10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37e20 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
37e30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
37e40 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
37e50 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
37e60 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
37e70 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
37e80 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
37e90 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
37ea0 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
37eb0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
37ec0 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
37ed0 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
37ee0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
37ef0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
37f00 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37f10 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
37f20 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
37f30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
37f40 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
37f50 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
37f60 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
37f70 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
37f80 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
37f90 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
37fa0 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
37fb0 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
37fc0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
37fd0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
37fe0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
37ff0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
38000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
38010 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
38020 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
38030 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
38040 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
38050 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
38060 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
38070 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
38080 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
38090 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
380a0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
380b0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
380c0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
380d0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
380e0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
380f0 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
38100 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
38110 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
38120 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
38130 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
38140 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
38150 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
38160 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
38170 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
38180 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
38190 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
381a0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
381b0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
381c0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
381d0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
381e0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
381f0 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
38200 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
38210 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52  ented..**.** *pR
38220 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45  C must be SQLITE
38230 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f  _OK when this ro
38240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
38250 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
38260 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
38270 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
38280 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
38290 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
382a0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
382b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
382c0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
382d0 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
382e0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
382f0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
38300 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
38310 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
38320 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
38330 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
38340 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
38350 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
38360 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
38370 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
38380 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
38390 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
383a0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
383b0 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
383c0 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
383d0 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
383e0 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
383f0 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
38400 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
38410 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
38420 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
38430 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
38440 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
38450 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
38460 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
38470 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
38480 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
38490 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20