/ Hex Artifact Content
Login

Artifact 7cd71f5579269590ebc864cb0e196fa02c52339a:


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 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40f0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
4100: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4120: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4130: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4140: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4150: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4160: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4170: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4180: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4190: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
41a0: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41b0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41c0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41d0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41f0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
4200: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4210: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4220: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4230: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4240: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4250: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4260: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4270: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4280: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4290: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
42a0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42b0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42c0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42d0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42e0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42f0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
4300: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4310: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4320: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4330: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4340: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4350: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4360: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4370: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4380: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4390: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
43a0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43b0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43c0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43d0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43e0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43f0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
4400: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4410: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4420: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4430: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4440: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4450: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4460: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4470: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4480: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4490: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
44a0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44b0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44c0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44d0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44e0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
4500: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4510: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4520: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4530: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4540: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4550: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4560: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4570: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4580: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4590: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
45a0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45b0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45c0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45d0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45e0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45f0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
4600: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4610: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4620: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4630: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4640: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4650: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4660: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4670: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4680: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4690: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
46a0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46b0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46c0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46d0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46e0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46f0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
4700: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4710: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4720: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4730: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4740: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4750: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4760: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4770: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4780: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4790: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
47a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47b0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47c0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47e0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4800: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4810: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4820: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4830: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4840: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4850: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4860: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4870: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4880: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4890: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48a0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48c0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48e0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48f0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
4900: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4910: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4920: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4930: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4940: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4950: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4960: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4970: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4980: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4990: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49b0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49c0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49d0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49e0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4a00: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a10: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a20: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a60: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a70: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a90: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4aa0: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4ab0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ac0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ad0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4af0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4b00: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b10: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b30: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b40: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b50: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b60: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b70: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b80: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b90: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4ba0: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4bb0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bc0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bd0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4be0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4bf0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4c00: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c10: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c20: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c30: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c40: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c50: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c60: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c70: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c80: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c90: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4ca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4cb0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cc0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cd0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4cf0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4d00: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d10: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d20: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d30: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d40: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d50: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d60: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d70: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d80: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d90: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4da0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4db0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4dc0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dd0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4de0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4df0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4e00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e10: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e20: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e40: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e50: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e60: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e70: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e80: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e90: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4ea0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4eb0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4ec0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ed0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ee0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ef0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4f00: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f10: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f20: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f30: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f40: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f50: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f60: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f70: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f80: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f90: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4fa0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fb0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fd0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fe0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4ff0: 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b  ate || CURSOR_SK
5000: 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53  IPNEXT==pCur->eS
5010: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5020: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5030: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5040: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5050: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5060: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5070: 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
5080: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5090: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
50a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
50b0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
50c0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
50d0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
50e0: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
50f0: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
5100: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
5110: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
5120: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
5130: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
5140: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
5150: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
5160: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
5170: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5180: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5190: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
51a0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
51b0: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
51c0: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
51d0: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
51e0: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
51f0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5200: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5210: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
5220: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
5230: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
5240: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
5250: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
5260: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
5270: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5280: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5290: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
52a0: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
52b0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
52c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
52d0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
52e0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
52f0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
5300: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5310: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
5320: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
5330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5340: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
5350: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
5360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5370: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
5380: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
5390: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
53a0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
53b0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
53c0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
53d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74  ITE_OK ){.    bt
53e0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
53f0: 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
5400: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
5410: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
5420: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
5430: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
5440: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
5450: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
5460: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5470: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
5480: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
5490: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
54a0: 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f  t(BtCursor*,Pgno
54b0: 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a  ,BtCursor*);../*
54c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
54d0: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
54e0: 72 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45  rsors (except pE
54f0: 78 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20  xcept) that are 
5500: 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74  open on.** the t
5510: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
5520: 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76  age iRoot.  "Sav
5530: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70  ing the cursor p
5540: 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74  osition" means t
5550: 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74  hat.** the locat
5560: 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65  ion in the btree
5570: 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69   is remembered i
5580: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
5590: 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d  t it can be.** m
55a0: 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  oved back to the
55b0: 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72   same spot after
55c0: 20 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62   the btree has b
55d0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54  een modified.  T
55e0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
55f0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
5600: 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63  fore cursor pExc
5610: 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ept is used to m
5620: 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62  odify the.** tab
5630: 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20  le, for example 
5640: 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29  in BtreeDelete()
5650: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5660: 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  )..**.** Impleme
5670: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5680: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5690: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
56a0: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
56b0: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
56c0: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
56d0: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
56e0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
56f0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5700: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5710: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5720: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5730: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5740: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5750: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5760: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5770: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5780: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5790: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
57a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
57c0: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
57d0: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
57e0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
57f0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5800: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5810: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5820: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5830: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5840: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
5850: 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75 72 73  urn p ? saveCurs
5860: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5870: 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a 20 53  ot, pExcept) : S
5880: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
5890: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
58a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
58b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
58c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
58d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
58e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
58f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
5900: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
5910: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
5920: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
5930: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
5940: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
5950: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
5960: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
5970: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
5980: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
5990: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
59a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
59b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
59c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
59d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
59e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
59f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
5a00: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
5a10: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
5a20: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
5a30: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
5a40: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
5a50: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
5a60: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
5a70: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
5a80: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
5a90: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
5aa0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
5ab0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
5ac0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5ad0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5ae0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
5af0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
5b00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5b10: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
5b20: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5b30: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5b40: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5b50: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5b60: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5b70: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
5b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
5b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5ba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
5bb0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
5bc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
5bd0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5be0: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d   }.    }.    p =
5c00: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68   p->pNext;.  }wh
5c10: 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75  ile( p );.  retu
5c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5c30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
5c40: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5c50: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5c60: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5c70: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5c80: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5c90: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5ca0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5cb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5cc0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5cd0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5ce0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5cf0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
5d00: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
5d10: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
5d20: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
5d30: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
5d40: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5d50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5d60: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5d70: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5d80: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5d90: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5da0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5db0: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5dc0: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5dd0: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5de0: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
5df0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
5e00: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
5e10: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
5e20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
5e30: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
5e40: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5e50: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5e60: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5e80: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5e90: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5ea0: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5eb0: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5ec0: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5ed0: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5ee0: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
5ef0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
5f00: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
5f10: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
5f20: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5f40: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5f50: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5f60: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5f70: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5f80: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5f90: 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20 20  pace[200];      
5fa0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5fb0: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5fc0: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5fd0: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5fe0: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
5ff0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6000: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6010: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6020: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6030: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6040: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
6050: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
6060: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
6070: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
6080: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
6090: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
60a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
60b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
60c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
60d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
60e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
60f0: 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  dxKey);.    if( 
6100: 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d  pIdxKey->nField=
6110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
6120: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6130: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
6140: 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ree);.      retu
6150: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6160: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
6170: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6180: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6190: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
61a0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
61b0: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
61c0: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
61d0: 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
61e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
61f0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
6200: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d  >db, pFree);.  }
6210: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6220: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6230: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6240: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6250: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6260: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6270: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6280: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6290: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
62a0: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
62b0: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
62c0: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
62d0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
62e0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
62f0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6300: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6310: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6320: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
6330: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
6340: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
6350: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
6360: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6370: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6380: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
6390: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
63a0: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
63b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
63c0: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
63d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
63e0: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
63f0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6400: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6410: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6420: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6430: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6440: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6450: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6460: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6470: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6480: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6490: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
64a0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
64b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
64c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
64d0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
64e0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
64f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6500: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6510: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6520: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6530: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6540: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6550: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6560: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6570: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6580: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6590: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
65a0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
65b0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
65c0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
65d0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
65e0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
65f0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6600: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6610: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6620: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6630: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6640: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6650: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6660: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6670: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6680: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6690: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
66a0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
66b0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
66c0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
66d0: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
66e0: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
66f0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6700: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6710: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6720: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6730: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6740: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6750: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6760: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6770: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6780: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6790: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
67a0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
67b0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
67c0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
67d0: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
67e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
67f0: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6800: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6810: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6820: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6830: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6850: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6860: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6870: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6880: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6890: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
68a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
68b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
68c0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
68d0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
68e0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
68f0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6900: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6910: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6920: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6930: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6940: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6950: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6960: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6970: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6980: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6990: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
69a0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
69b0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
69c0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
69d0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
69e0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
69f0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
6a00: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
6a10: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
6a20: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
6a30: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
6a40: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
6a50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
6a60: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
6a70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6a80: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
6a90: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
6aa0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
6ab0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
6ac0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
6ad0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6ae0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
6af0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6b00: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
6b10: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
6b20: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
6b30: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6b40: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
6b50: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
6b60: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
6b70: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
6b80: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6b90: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6ba0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
6bb0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
6bc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6bd0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6be0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
6bf0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
6c00: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
6c10: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6c20: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
6c30: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
6c40: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
6c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c60: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
6c70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6c80: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
6c90: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
6ca0: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
6cb0: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
6cc0: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
6cd0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
6ce0: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
6cf0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
6d00: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
6d10: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
6d20: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
6d30: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
6d40: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
6d50: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
6d60: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
6d70: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
6d80: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
6d90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
6da0: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
6db0: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
6dc0: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
6dd0: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
6de0: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
6df0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
6e00: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
6e10: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
6e20: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
6e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6e60: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
6e70: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
6e80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
6e90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
6ea0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
6eb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
6ec0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
6ed0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
6ee0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
6ef0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
6f00: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
6f10: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
6f20: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
6f30: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
6f40: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
6f50: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
6f60: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
6f70: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
6f80: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6f90: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
6fa0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
6fb0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
6fc0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
6fd0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6fe0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
6ff0: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
7000: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
7010: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
7020: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
7030: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
7040: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
7050: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
7060: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
7070: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
7080: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
7090: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
70a0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
70b0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
70c0: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
70d0: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
70e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
70f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
7100: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
7110: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7120: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7130: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
7140: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
7150: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7160: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
7170: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
7180: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7190: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
71a0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
71c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
71d0: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
71e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
71f0: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
7200: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7210: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7220: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
7230: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
7240: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
7250: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
7260: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7270: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
7280: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
7290: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
72a0: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
72b0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
72c0: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
72d0: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
72e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
72f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
7300: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
7310: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
7320: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
7330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
7340: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
7350: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7360: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7370: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7380: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7390: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
73b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
73c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
73d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
73e0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
73f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7400: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7420: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7430: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7440: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7450: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7460: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7470: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7480: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7490: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
74a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
74b0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
74c0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
74d0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
74e0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
74f0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7500: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7510: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7520: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7540: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7550: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
7560: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
7570: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7580: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
7590: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
75a0: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
75b0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
75d0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
75e0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7600: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
7610: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
7620: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
7630: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
7640: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
7650: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
7660: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
7670: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
7680: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
7690: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
76a0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
76b0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
76c0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
76d0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
76e0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
76f0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
7700: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
7710: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
7720: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
7730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7740: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
7750: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
7760: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7770: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
7780: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7790: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
77a0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
77b0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
77c0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
77d0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
77e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
77f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7800: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7810: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
7820: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
7830: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
7840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
7850: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
7860: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
7870: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
7880: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
7890: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
78a0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
78b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
78c0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
78d0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
78e0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
78f0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7900: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
7910: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7920: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
7930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7940: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
7950: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
7960: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
7970: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
7980: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
7990: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
79a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
79b0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
79c0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
79d0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
79e0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
79f0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
7a00: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
7a10: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
7a20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7a40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7a50: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
7a60: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
7a70: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
7a80: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
7a90: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
7aa0: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
7ab0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
7ac0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
7ad0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
7ae0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
7af0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
7b00: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
7b10: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
7b20: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
7b30: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
7b40: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
7b50: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
7b60: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
7b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7b80: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
7b90: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  content..**.** T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
7bb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
7bc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
7bd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7be0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
7bf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
7c00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
7c10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
7c20: 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e   get2byte(&(P)->
7c30: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
7c40: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
7c50: 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28  ellv2(D,M,O,I) (
7c60: 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b  D+(M&get2byte(D+
7c70: 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f  (O+2*(I))))).../
7c80: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
7c90: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
7ca0: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
7cb0: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
7cc0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
7cd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7ce0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
7cf0: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
7d00: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
7d10: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
7d20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
7d30: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7d40: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7d50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7d60: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
7d70: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
7d80: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
7d90: 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e  .    k = pPage->
7da0: 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69  aiOvfl[i];.    i
7db0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
7dc0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
7dd0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
7de0: 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  urn pPage->apOvf
7df0: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  l[i];.      }.  
7e00: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7e20: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7e30: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7e40: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7e50: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
7e60: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
7e70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
7e80: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
7e90: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
7ea0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
7eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7ec0: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7ed0: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7ee0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7ef0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7f00: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7f10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7f20: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7f30: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7f40: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7f50: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f60: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7f70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7f80: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7f90: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7fa0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fc0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
7fd0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
7fe0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ff0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8000: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8010: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
8020: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
8030: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
8040: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
8050: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
8060: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
8070: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
8080: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
8090: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
80b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
80c0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
80d0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
80e0: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
80f0: 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
8100: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
8110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8120: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8130: 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 72 20  =0 );.    pIter 
8140: 3d 20 70 43 65 6c 6c 20 2b 20 67 65 74 56 61 72  = pCell + getVar
8150: 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61  int32(pCell, nPa
8160: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 74 65  yload);.    pIte
8170: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70  r += getVarint(p
8180: 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e  Iter, (u64*)&pIn
8190: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
81a0: 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f  se if( pPage->no
81b0: 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61  Payload ){.    a
81c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
81d0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
81e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
81f0: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8200: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8210: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8220: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ;.    pInfo->nPa
8230: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70  yload = 0;.    p
8240: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30  Info->nLocal = 0
8250: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
8260: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
8270: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
8280: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  = 0;.    return;
8290: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
82a0: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
82b0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
82c0: 65 3b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e;.    pIter += 
82d0: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
82e0: 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  r, nPayload);.  
82f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
8300: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20  nPayload;.  }.  
8310: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
8320: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
8330: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
8340: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
8350: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
8360: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8370: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
8380: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
8390: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
83a0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
83b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
83c0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
83d0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
83e0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
83f0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
8400: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
8410: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
8420: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
8430: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
8440: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
8450: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
8460: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8470: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
8480: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
8490: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
84a0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
84b0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
84c0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
84d0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
84e0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
84f0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8500: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
8510: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
8520: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
8530: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
8540: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
8550: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
8560: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
8570: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
8580: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8590: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
85a0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
85b0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
85c0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
85d0: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
85e0: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
85f0: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
8600: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
8610: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
8620: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
8630: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
8640: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
8650: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
8660: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
8670: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
8680: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
8690: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
86a0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
86b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
86c0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
86d0: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
86e0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
86f0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8700: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
8710: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
8720: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
8730: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
8740: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
8750: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
8760: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8770: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8780: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8790: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
87a0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
87b0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
87c0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
87d0: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
87e0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
87f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8800: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
8810: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8820: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
8830: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
8840: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8850: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
8860: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8870: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8880: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8890: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
88a0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
88b0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
88c0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
88d0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
88e0: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
88f0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8900: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
8910: 65 6c 6c 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  ell);.    pInfo-
8920: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
8930: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
8940: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
8950: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
8960: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8970: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8980: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8990: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
89a0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
89b0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
89c0: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
89d0: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
89e0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
89f0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8a00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8a10: 2f 0a 29 7b 0a 20 20 62 74 72 65 65 50 61 72 73  /.){.  btreePars
8a20: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8a30: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8a40: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
8a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8a60: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
8a70: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8a80: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8a90: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8aa0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8ab0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8ac0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8ad0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8ae0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8af0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8b00: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8b10: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
8b20: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
8b30: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
8b40: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8b50: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
8b60: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8b70: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8b80: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
8b90: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
8ba0: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
8bb0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
8bc0: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
8bd0: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
8c00: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
8c10: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
8c20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c40: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
8c50: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
8c60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8c70: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
8c80: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
8c90: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8ca0: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
8cb0: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
8cc0: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
8cd0: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
8ce0: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
8cf0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
8d00: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
8d10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
8d20: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
8d30: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
8d40: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
8d50: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
8d60: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
8d70: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
8d80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
8d90: 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50  uginfo;.  btreeP
8da0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8db0: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
8dc0: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
8dd0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61   if( pPage->noPa
8de0: 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 70 45 6e  yload ){.    pEn
8df0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8e00: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8e10: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
8e20: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 61  er<pEnd );.    a
8e30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8e40: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 75 31 36  .    return (u16
8e60: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8e70: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20  ;.  }.  nSize = 
8e80: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
8e90: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
8ea0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
8eb0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
8ec0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
8ed0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
8ee0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
8ef0: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f00: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
8f10: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
8f20: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
8f30: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
8f40: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8f50: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
8f60: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
8f70: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
8f80: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
8f90: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
8fa0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
8fb0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
8fc0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
8fd0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
8fe0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
8ff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9000: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
9010: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
9020: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
9030: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
9040: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
9050: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
9060: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
9070: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9080: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
9090: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
90a0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
90b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
90c0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
90d0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
90e0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
90f0: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
9100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9110: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
9120: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
9130: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
9140: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
9150: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
9160: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
9170: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
9180: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
9190: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
91b0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
91c0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
91d0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
91e0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
91f0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
9200: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
9210: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
9220: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9230: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
9240: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
9250: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
9260: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
9270: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
9280: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9290: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
92a0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
92b0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
92c0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
92d0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
92e0: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
92f0: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
9300: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9310: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
9320: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9330: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9340: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
9350: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
9360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
9370: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
9380: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
9390: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
93a0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
93b0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
93c0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
93d0: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
93e0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
93f0: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
9400: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
9410: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
9420: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
9430: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
9440: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
9450: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
9460: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
9470: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
9480: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
9490: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
94a0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
94b0: 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
94c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
94d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
94e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
94f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
9500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
9510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
9520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
9530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
9540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
9550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
9560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
9570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
9580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
9590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
95a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
95b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
95c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
95d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
95e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
95f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
9600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
9610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
9620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
9630: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
9640: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
9650: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
9660: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
9670: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
9680: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
9690: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
96a0: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
96b0: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
96c0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
96d0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
96e0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
96f0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
9700: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
9710: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
9720: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
9730: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
9740: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9750: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
9760: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
9770: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9790: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
97a0: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
97d0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
97e0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
97f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
9800: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
9810: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
9820: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
9830: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9840: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
9850: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
9860: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9870: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
9880: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
9890: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
98a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
98b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
98c0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
98d0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98f0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
9900: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9910: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
9920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9930: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9940: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
9950: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9960: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
9970: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
9980: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
9990: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
99a0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
99b0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
99c0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
99d0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
99e0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
99f0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9a00: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9a10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9a20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
9a30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
9a40: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
9a50: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
9a60: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9a70: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
9a80: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9a90: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9aa0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9ab0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9ac0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ad0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9ae0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9af0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9b00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9b10: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9b20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
9b40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
9b50: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
9b60: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
9b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
9b80: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
9b90: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
9ba0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
9bb0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
9bc0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
9bd0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
9be0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
9bf0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
9c00: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
9c10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9c20: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
9c30: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
9c40: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
9c50: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
9c60: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
9c70: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
9c80: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
9c90: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
9ca0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
9cb0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
9cc0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
9cd0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
9ce0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
9cf0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
9d00: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d10: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
9d20: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9d30: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
9d40: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
9d50: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
9d60: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
9d70: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
9d80: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
9d90: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
9da0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
9db0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9dc0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9dd0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9de0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9df0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e00: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
9e10: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9e20: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9e30: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9e40: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9e50: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
9e60: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
9e70: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9e80: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
9e90: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
9ea0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9eb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
9ed0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9ee0: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9ef0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9f00: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9f10: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9f20: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9f30: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9f40: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9f50: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9f60: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
9f70: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
9f80: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
9f90: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
9fa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
9fb0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
9fc0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
9fd0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
9fe0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
9ff0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
a000: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
a010: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
a020: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
a030: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
a040: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
a050: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
a060: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
a070: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
a080: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
a090: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
a0a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a0b0: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
a0c0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
a0d0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
a0e0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
a0f0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
a100: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
a110: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
a120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a130: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a140: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a150: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
a160: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
a170: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
a180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a190: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a1a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a1b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
a1c0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
a1d0: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
a1e0: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
a1f0: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
a200: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
a210: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
a220: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
a230: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
a240: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
a250: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
a260: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
a270: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
a280: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
a290: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
a2a0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
a2b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
a2c0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
a2d0: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
a2e0: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
a2f0: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
a300: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
a310: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
a320: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
a330: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
a340: 2a 2a 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20  ** If a slot of 
a350: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
a360: 79 74 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75  ytes is found bu
a370: 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  t cannot be used
a380: 20 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65   because .** the
a390: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  re are already a
a3a0: 74 20 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d  t least 60 fragm
a3b0: 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74  ented bytes on t
a3c0: 68 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  he page, return 
a3d0: 4e 55 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  NULL..** In this
a3e0: 20 63 61 73 65 2c 20 69 66 20 70 62 44 65 66 72   case, if pbDefr
a3f0: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
a400: 6e 6f 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70  not NULL, set *p
a410: 62 44 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e  bDefrag to true.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70  .*/.static u8 *p
a430: 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50  ageFindSlot(MemP
a440: 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42  age *pPg, int nB
a450: 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69  yte, int *pRc, i
a460: 6e 74 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20  nt *pbDefrag){. 
a470: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
a480: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
a490: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
a4a0: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
a4b0: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20  ;.  int iAddr;. 
a4c0: 20 69 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75   int pc;.  int u
a4d0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
a4e0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a4f0: 3b 0a 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68  ;..  for(iAddr=h
a500: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
a510: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
a520: 72 5d 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63  r]))>0; iAddr=pc
a530: 29 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  ){.    int size;
a540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a550: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
a560: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
a570: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
a580: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
a590: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
a5a0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
a5b0: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
a5c0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
a5d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
a5e0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
a5f0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
a600: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
a610: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a620: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a630: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
a640: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
a650: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
a660: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
a670: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
a680: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
a690: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a6a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a6b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
a6c0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
a6d0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
a6e0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
a6f0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
a700: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
a710: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
a720: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
a730: 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
a740: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
a750: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
a760: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
a770: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
a780: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
a790: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
a7a0: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35  CE-OF: R-11498-5
a7b0: 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66  8022 In a well-f
a7c0: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
a7d0: 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20  e, the total.   
a7e0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
a7f0: 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d  f bytes in fragm
a800: 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63  ents may not exc
a810: 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20  eed 60. */.     
a820: 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72     if( aData[hdr
a830: 2b 37 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20  +7]>=60 ){.     
a840: 20 20 20 20 20 69 66 28 20 70 62 44 65 66 72 61       if( pbDefra
a850: 67 20 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20  g ) *pbDefrag = 
a860: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  1;.          ret
a870: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
a880: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
a890: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
a8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
a8b0: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
a8c0: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
a8d0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
a8e0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
a8f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
a900: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
a910: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
a920: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
a930: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
a940: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
a950: 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c  ( pc < pPg->cell
a960: 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43  Offset+2*pPg->nC
a970: 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e  ell || size+pc >
a980: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
a990: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
a9a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a9b0: 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  T;.        retur
a9c0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
a9d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
a9e0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
a9f0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
aa00: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
aa10: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
aa20: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
aa30: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
aa40: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
aa50: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
aa60: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
aa70: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
aa80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
aa90: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
aaa0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
aab0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
aac0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
aad0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
aae0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
aaf0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
ab00: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
ab10: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
ab20: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
ab30: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
ab40: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
ab50: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ab60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
ab70: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
ab80: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
ab90: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
aba0: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
abb0: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
abc0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
abd0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
abe0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
abf0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
ac00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
ac10: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
ac20: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
ac30: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
ac40: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
ac50: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
ac60: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
ac70: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
ac80: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
ac90: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
aca0: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
acb0: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
acc0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
acd0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
ace0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
acf0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
ad00: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
ad10: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
ad20: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
ad30: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
ad40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad50: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
ad60: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
ad70: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
ad80: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
ad90: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ada0: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
adb0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
adc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
add0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
ade0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
adf0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
ae00: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ae10: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
ae20: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
ae50: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
ae60: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
ae70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ae90: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
aea0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
aeb0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
aec0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
aed0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
aee0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
aef0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
af00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
af10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
af20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
af30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
af40: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
af50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
af60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
af70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
af80: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
af90: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
afa0: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
afb0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
afc0: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
afd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
afe0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
aff0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
b000: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
b010: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b020: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
b030: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
b040: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
b050: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
b060: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
b070: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
b080: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
b090: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
b0a0: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
b0b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
b0c0: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
b0d0: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
b0e0: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
b0f0: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
b100: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
b110: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
b120: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
b130: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
b140: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
b150: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
b160: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
b170: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
b180: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
b190: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
b1a0: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
b1b0: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
b1c0: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
b1d0: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
b1e0: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
b1f0: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
b200: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
b210: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
b220: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
b230: 20 67 61 70 3e 74 6f 70 20 7c 7c 20 28 75 33 32   gap>top || (u32
b240: 29 74 6f 70 3e 70 50 61 67 65 2d 3e 70 42 74 2d  )top>pPage->pBt-
b250: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
b260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b270: 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
b280: 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  If there is enou
b290: 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e  gh space between
b2a0: 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72   gap and top for
b2b0: 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70   one more cell p
b2c0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61  ointer.  ** arra
b2d0: 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20  y entry offset, 
b2e0: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
b2f0: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
b300: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
b310: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
b320: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72  looking for a fr
b330: 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75  ee slot big enou
b340: 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  gh to satisfy th
b350: 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a  e request..  */.
b360: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b370: 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  2==top );.  test
b380: 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70  case( gap+1==top
b390: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
b3a0: 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  gap==top );.  if
b3b0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20  ( gap+2<=top && 
b3c0: 28 64 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20  (data[hdr+1] || 
b3d0: 64 61 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a  data[hdr+2]) ){.
b3e0: 20 20 20 20 69 6e 74 20 62 44 65 66 72 61 67 20      int bDefrag 
b3f0: 3d 20 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70  = 0;.    u8 *pSp
b400: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
b410: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
b420: 20 26 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b   &rc, &bDefrag);
b430: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
b440: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
b450: 20 62 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20   bDefrag ) goto 
b460: 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b  defragment_page;
b470: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
b480: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b490: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
b4a0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
b4b0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
b4c0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
b4d0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
b4e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b4f0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
b500: 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73  .  /* The reques
b510: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66  t could not be f
b520: 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61  ulfilled using a
b530: 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20   freelist slot. 
b540: 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73   Check.  ** to s
b550: 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74  ee if defragment
b560: 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61  ation is necessa
b570: 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ry..  */.  testc
b580: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
b590: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
b5a0: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
b5b0: 7b 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61  {. defragment_pa
b5c0: 67 65 3a 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge:.    assert( 
b5d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
b5e0: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
b5f0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
b600: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
b610: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
b620: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
b630: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b640: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
b660: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
b670: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
b680: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
b690: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
b6a0: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
b6b0: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
b6c0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
b6d0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
b6e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
b6f0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
b700: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
b710: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
b720: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
b730: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
b740: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
b750: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
b760: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
b770: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
b780: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
b790: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
b7a0: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
b7b0: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
b7c0: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
b7d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
b7e0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b7f0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
b800: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
b810: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
b820: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b830: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
b840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b860: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
b870: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
b880: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
b890: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
b8a0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
b8b0: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
b8c0: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
b8d0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
b8e0: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
b8f0: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
b900: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
b910: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
b920: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
b930: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
b940: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
b950: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
b960: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
b970: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
b980: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
b990: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
b9a0: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
b9b0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
b9c0: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
b9d0: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
b9e0: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
b9f0: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
ba00: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
ba10: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ba20: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
ba30: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
ba40: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
ba50: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
ba60: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
ba70: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
ba80: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
ba90: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
baa0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
bab0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
bac0: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
bad0: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
bae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb00: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
bb10: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
bb20: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
bb30: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bb50: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
bb60: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
bb70: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bba0: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
bbb0: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
bbc0: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbe0: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
bbf0: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
bc00: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
bc10: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bc30: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
bc40: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
bc50: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
bc60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
bc70: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
bc80: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
bc90: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
bca0: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
bcb0: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
bcc0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
bcd0: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
bce0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
bcf0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
bd00: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bd10: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
bd20: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
bd30: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
bd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
bd50: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
bd60: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
bd70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
bd80: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
bd90: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
bda0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
bdb0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
bdc0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
bdd0: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
bde0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
bdf0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
be00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
be10: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
be20: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
be30: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
be40: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
be50: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
be60: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
be70: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
be80: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
be90: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
bea0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
beb0: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
bec0: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
bed0: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
bee0: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
bef0: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
bf00: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
bf10: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
bf20: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
bf30: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
bf40: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
bf50: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bf60: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bf70: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
bf80: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
bf90: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
bfa0: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
bfb0: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
bfc0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
bfd0: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
bfe0: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
bff0: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
c000: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
c010: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
c020: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
c030: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
c040: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
c050: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
c060: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
c070: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
c080: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
c090: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
c0a0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
c0b0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
c0c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c0d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c0e0: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
c0f0: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
c100: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
c110: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
c120: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
c140: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
c150: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
c160: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c170: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
c180: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
c190: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
c1a0: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
c1b0: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
c1c0: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
c1d0: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
c1e0: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
c1f0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
c200: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c210: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
c220: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
c230: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
c240: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
c250: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
c260: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
c270: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
c280: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
c290: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
c2a0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
c2b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c2c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
c2d0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
c2e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c2f0: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
c300: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c310: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
c320: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
c330: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c340: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
c350: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
c360: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
c370: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
c380: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
c390: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
c3a0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
c3b0: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
c3c0: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
c3d0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
c3e0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
c3f0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
c400: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
c410: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
c420: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
c430: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
c440: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
c450: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
c460: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
c470: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c480: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
c490: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
c4a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c4b0: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
c4c0: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
c4d0: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
c4e0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
c4f0: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
c500: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
c510: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c520: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
c530: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
c540: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c550: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
c560: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
c570: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
c580: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c590: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
c5a0: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
c5b0: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
c5c0: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
c5d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
c5e0: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
c5f0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
c600: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
c610: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
c620: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
c630: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
c640: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
c650: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c660: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c670: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c680: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
c690: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c6a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
c6b0: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
c6c0: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
c6d0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c6e0: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
c6f0: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
c700: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
c710: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
c720: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c730: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
c740: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c750: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
c760: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c770: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
c780: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
c790: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c7a0: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
c7b0: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
c7c0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c7d0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
c7e0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
c7f0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
c800: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
c810: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
c820: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c830: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
c840: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
c850: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
c860: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
c870: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
c880: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
c890: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
c8a0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
c8b0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c8c0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
c8d0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
c8e0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
c8f0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
c900: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c910: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
c920: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
c930: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
c940: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c950: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
c960: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c970: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
c980: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
c990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c9a0: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
c9b0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c9c0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
c9d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c9e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
c9f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ca00: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ca10: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ca20: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
ca30: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
ca40: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
ca50: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
ca60: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
ca70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
ca80: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ca90: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
caa0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
cab0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
cac0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
cad0: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
cae0: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
caf0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
cb00: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
cb10: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
cb20: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cb30: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
cb40: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
cb50: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
cb60: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
cb70: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
cb80: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
cb90: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
cba0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
cbb0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
cbc0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
cbd0: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
cbe0: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
cbf0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cc00: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
cc10: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
cc20: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
cc30: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
cc40: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
cc50: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
cc60: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
cc70: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
cc80: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
cc90: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
cca0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
ccb0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
ccc0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
ccd0: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
cce0: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
ccf0: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
cd00: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
cd10: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
cd20: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
cd30: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
cd40: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
cd50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cd60: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
cd70: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
cd80: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
cd90: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
cda0: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
cdb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cdc0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
cdd0: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
cde0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
cdf0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ce00: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ce10: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
ce20: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
ce30: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ce40: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
ce50: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
ce60: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
ce70: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
ce80: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce90: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
cea0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
ceb0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
cec0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
ced0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
cee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cf00: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
cf10: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
cf20: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
cf30: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
cf40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cf50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cf60: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
cf70: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
cf80: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
cf90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
cfa0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
cfb0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
cfc0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
cfd0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
cfe0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
cff0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
d000: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
d010: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
d020: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
d030: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
d040: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
d050: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
d060: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
d070: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
d080: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
d090: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
d0a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d0b0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
d0c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d0d0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
d0e0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d0f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d100: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
d110: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d120: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d130: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d140: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d150: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
d160: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
d170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d190: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
d1a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
d1b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
d1c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
d1d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
d1e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
d1f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
d200: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
d210: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
d220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
d230: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
d240: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
d250: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
d260: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
d270: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
d280: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
d290: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
d2a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
d2b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
d2c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
d2d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
d2e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
d2f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
d300: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
d310: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
d320: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
d330: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
d340: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
d350: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
d360: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
d370: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
d380: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
d390: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
d3a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
d3b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
d3c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
d3d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
d3e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
d3f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
d400: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
d410: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
d420: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
d430: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
d440: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
d450: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
d460: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
d470: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
d480: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
d490: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
d4a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
d4b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
d4c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d4d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
d4e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d4f0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
d500: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
d510: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
d520: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
d530: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
d540: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
d550: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
d560: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
d570: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
d580: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
d590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
d5b0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
d5c0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
d5d0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
d5e0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
d5f0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
d600: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
d610: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
d620: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
d630: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
d640: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
d650: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
d660: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
d670: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
d680: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
d690: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
d6a0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
d6b0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
d6c0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
d6d0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
d6e0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d6f0: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
d700: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
d710: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
d720: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
d730: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
d740: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d750: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
d760: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
d770: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
d780: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
d790: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
d7a0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
d7b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
d7c0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d7d0: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
d7e0: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
d7f0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
d800: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
d810: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
d820: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
d830: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
d840: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
d850: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
d860: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
d870: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
d880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
d890: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
d8a0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
d8b0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
d8c0: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
d8d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8f0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
d900: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
d910: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
d920: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
d930: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
d940: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
d950: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
d960: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
d970: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
d980: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
d990: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
d9a0: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
d9b0: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
d9c0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
d9d0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
d9e0: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
d9f0: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
da00: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
da10: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
da20: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
da30: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
da40: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
da50: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
da60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
da70: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
da80: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
da90: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
daa0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
dab0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
dac0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
dad0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
dae0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
daf0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
db00: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
db10: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
db20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
db30: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
db40: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
db50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
db60: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
db70: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
db80: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
db90: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
dba0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
dbb0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
dbc0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
dbd0: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
dbe0: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
dbf0: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
dc00: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
dc10: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
dc20: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dc30: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dc40: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dc50: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dc60: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dc70: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dc80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc90: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dca0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dcb0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dcc0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dcd0: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dce0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dcf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd00: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dd10: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dd20: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dd30: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd40: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dd50: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dd60: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dd70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dd80: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd90: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dda0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
ddb0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
ddc0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
ddd0: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dde0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ddf0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
de00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
de10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
de20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
de30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
de40: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
de50: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
de60: 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f  ;.    }  ..    /
de70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
de80: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
de90: 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a  n the page.    *
dea0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
deb0: 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65  -23588-34450 The
dec0: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ded0: 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69  r at offset 1 gi
dee0: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ves the.    ** s
def0: 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73  tart of the firs
df00: 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74  t freeblock on t
df10: 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a  he page, or is z
df20: 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65  ero if there are
df30: 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62   no.    ** freeb
df40: 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63  locks. */.    pc
df50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
df60: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
df70: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
df80: 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e  7] + top;  /* In
df90: 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d  it nFree to non-
dfa0: 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73  freeblock free s
dfb0: 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c  pace */.    whil
dfc0: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
dfd0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
dfe0: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
dff0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
e000: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
e010: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e020: 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
e030: 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
e040: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
e050: 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
e060: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
e070: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c  at least one cel
e080: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  l before the fir
e090: 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20  st freeblock..  
e0a0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
e0b0: 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65   ** Or, the free
e0c0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
e0d0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e0e0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
e0f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e100: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
e110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
e120: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
e130: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
e140: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
e150: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
e160: 20 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30       if( (next>0
e170: 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a   && next<=pc+siz
e180: 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e  e+3) || pc+size>
e190: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e1a0: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
e1b0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
e1c0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
e1d0: 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79   And the last by
e1e0: 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  te of.        **
e1f0: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
e200: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
e210: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
e220: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e230: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e240: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e250: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
e260: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
e270: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
e280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
e290: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
e2a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
e2b0: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
e2c0: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
e2d0: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
e2e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
e2f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
e300: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
e310: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
e320: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
e330: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
e340: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
e350: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
e360: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
e370: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
e380: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
e390: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
e3a0: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
e3b0: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
e3c0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
e3d0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
e3e0: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
e3f0: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
e400: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
e410: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
e420: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
e430: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
e440: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
e450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e460: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
e470: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
e480: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
e490: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
e4a0: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
e4b0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
e4c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e4d0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
e4e0: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
e4f0: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
e500: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
e510: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
e520: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
e530: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
e540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
e550: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
e560: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e570: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e580: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
e590: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
e5a0: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
e5b0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
e5c0: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
e5d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e5e0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
e5f0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
e600: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
e610: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
e620: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
e630: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
e640: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
e650: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e660: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
e670: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
e680: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
e690: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
e6a0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
e6b0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
e6c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e6d0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e6e0: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
e6f0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
e700: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
e710: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
e720: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
e730: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
e740: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
e750: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
e760: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
e770: 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   + ((flags&PTF_L
e780: 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38  EAF)==0 ? 12 : 8
e790: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
e7a0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
e7b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
e7c0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
e7d0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
e7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
e7f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
e800: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
e810: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
e820: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
e830: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
e840: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
e850: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
e860: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
e870: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
e880: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
e890: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
e8a0: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
e8b0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
e8d0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
e8e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
e8f0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
e900: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
e910: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
e920: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
e930: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
e940: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
e950: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
e960: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
e970: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
e980: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
e990: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
e9a0: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
e9b0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
e9c0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
e9d0: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
e9e0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
e9f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
ea00: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
ea10: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
ea20: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
ea30: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
ea40: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
ea50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ea60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
ea70: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
ea80: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
ea90: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
eaa0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
eab0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
eac0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
ead0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
eae0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
eaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
eb00: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
eb10: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
eb20: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
eb30: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
eb40: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
eb50: 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61  f needed.  See a
eb60: 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75  lso: btreeGetUnu
eb70: 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  sedPage()..**.**
eb80: 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45   If the PAGER_GE
eb90: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67  T_NOCONTENT flag
eba0: 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
ebb0: 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
ebc0: 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74   care.** about t
ebd0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
ebe0: 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
ebf0: 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
ec00: 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
ec10: 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
ec20: 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
ec30: 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
ec40: 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
ec50: 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
ec60: 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
ec70: 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
ec80: 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
ec90: 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
eca0: 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
ecb0: 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
ecc0: 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
ecd0: 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
ece0: 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
ecf0: 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
ed00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
ed10: 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
ed20: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
ed30: 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
ed40: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
ed50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ed60: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
ed70: 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
ed80: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
ed90: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
eda0: 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
edb0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
edc0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
edd0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
ede0: 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
edf0: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
ee00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
ee10: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
ee20: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
ee30: 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
ee40: 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
ee50: 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
ee60: 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
ee70: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
ee80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
ee90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
eea0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
eeb0: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
eec0: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
eed0: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
eee0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
eef0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ef00: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
ef10: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
ef20: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
ef30: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
ef40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ef50: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
ef60: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
ef70: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
ef80: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
ef90: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
efa0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
efb0: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
efc0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
efd0: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
efe0: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
eff0: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
f000: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
f010: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
f020: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
f030: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
f040: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
f050: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
f060: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f070: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
f080: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
f090: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
f0a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
f0b0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
f0c0: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
f0d0: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
f0e0: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
f0f0: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
f100: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f110: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
f120: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
f130: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
f140: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
f150: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
f160: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
f170: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
f180: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
f190: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
f1a0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
f1b0: 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
f1c0: 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
f1d0: 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
f1e0: 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
f1f0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
f200: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
f210: 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
f220: 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
f230: 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
f240: 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
f250: 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
f260: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
f270: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
f280: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
f290: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
f2a0: 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e  is just a.** con
f2b0: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
f2c0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
f2d0: 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47   calls to btreeG
f2e0: 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a  etPage() and .**
f2f0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
f300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
f310: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
f320: 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61   the value *ppPa
f330: 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73 20  ge is set to is 
f340: 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a  undefined. It.**
f350: 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68   may remain unch
f360: 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79  anged, or it may
f370: 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e   be set to an in
f380: 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a  valid value..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e  static int getAn
f3a0: 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53  dInitPage(.  BtS
f3b0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f3d0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
f3e0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
f3f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f400: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f410: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
f420: 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  get */.  MemPage
f430: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
f440: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
f450: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
f460: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  er here */.  int
f470: 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20   bReadonly      
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f490: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
f4a0: 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20 20  LY or 0 */.){.  
f4b0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
f4c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f4d0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
f4e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 52   );.  assert( bR
f4f0: 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f 47  eadonly==PAGER_G
f500: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20 62  ET_READONLY || b
f510: 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a  Readonly==0 );..
f520: 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65    if( pgno>btree
f530: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
f540: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
f550: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f560: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
f570: 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
f580: 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  Bt, pgno, ppPage
f590: 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20 20  , bReadonly);.  
f5a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f5b0: 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65 29  _OK && (*ppPage)
f5c0: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  ->isInit==0 ){. 
f5d0: 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49       rc = btreeI
f5e0: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
f5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
f600: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f610: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
f620: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
f630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f640: 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
f650: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f660: 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
f670: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
f680: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f690: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
f6a0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
f6b0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
f6c0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
f6d0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
f6e0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
f6f0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
f700: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
f710: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
f720: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
f730: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
f740: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f750: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
f760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f770: 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20  >pDbPage!=0 );. 
f780: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f790: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
f7a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f7b0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
f7c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f7d0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
f7e0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
f7f0: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
f800: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f810: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f820: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f830: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
f840: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
f850: 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62  tNull(pPage->pDb
f860: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
f870: 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65  .** Get an unuse
f880: 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d page..**.** Th
f890: 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
f8a0: 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ke btreeGetPage(
f8b0: 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  ) with the addit
f8c0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ion:.**.**   *  
f8d0: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  If the page is a
f8e0: 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f  lready in use fo
f8f0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
f900: 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c  pose, immediatel
f910: 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73  y.**      releas
f920: 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  e it and return 
f930: 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50  an SQLITE_CURRUP
f940: 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20  T error..**   * 
f950: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69   Make sure the i
f960: 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c  sInit flag is cl
f970: 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ear.*/.static in
f980: 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  t btreeGetUnused
f990: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
f9a0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
f9b0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
f9c0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
f9d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f9e0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
f9f0: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
fa00: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
fa10: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
fa20: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
fa30: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fa50: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
fa60: 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
fa70: 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
fa80: 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
fa90: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
faa0: 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29  , ppPage, flags)
fab0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
fac0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
fad0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
fae0: 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
faf0: 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
fb00: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
fb10: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
fb20: 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
fb30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
fb40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fb50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
fb60: 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
fb70: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
fb80: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
fb90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fba0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  }.../*.** During
fbb0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
fbc0: 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
fbd0: 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
fbe0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
fbf0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
fc00: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
fc10: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
fc20: 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
fc30: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
fc40: 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
fc50: 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
fc60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
fc70: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
fc80: 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
fc90: 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
fca0: 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
fcb0: 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
fcc0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
fcd0: 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
fce0: 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
fcf0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
fd00: 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
fd10: 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
fd20: 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
fd30: 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
fd40: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
fd50: 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
fd60: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
fd70: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
fd80: 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
fd90: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
fda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
fdb0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
fdc0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
fdd0: 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
fde0: 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
fdf0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
fe00: 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
fe10: 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
fe20: 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
fe30: 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
fe40: 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
fe50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
fe60: 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
fe70: 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
fe80: 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
fe90: 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
fea0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
feb0: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
fec0: 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
fed0: 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
fee0: 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
fef0: 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
ff00: 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
ff10: 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
ff20: 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
ff30: 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
ff40: 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
ff50: 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
ff60: 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
ff70: 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
ff80: 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
ff90: 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
ffa0: 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
ffb0: 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
ffc0: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
ffd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
ffe0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
fff0: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
10000 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
10010 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
10020 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
10030 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
10040 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
10050 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
10060 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
10070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10080 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10090 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
100a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
100b0 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
100c0 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
100d0 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
100e0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
100f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
10100 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
10110 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
10120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
10130 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
10140 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e   NULL.** then an
10150 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
10160 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ase is created. 
10170 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   The ephemeral d
10180 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a  atabase might.**
10190 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20   be exclusively 
101a0 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74  in memory, or it
101b0 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73   might use a dis
101c0 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63  k-based memory c
101d0 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20  ache..** Either 
101e0 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72  way, the ephemer
101f0 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  al database will
10200 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
10210 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68  y deleted .** wh
10220 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
10230 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
10240 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
10250 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
10260 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
10270 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
10280 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
10290 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
102a0 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
102b0 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
102c0 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22  *.** The "flags"
102d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
102e0 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67  bitmask that mig
102f0 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20  ht contain bits 
10300 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d  like.** BTREE_OM
10310 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f  IT_JOURNAL and/o
10320 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a  r BTREE_MEMORY..
10330 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
10340 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
10350 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73   opened in the s
10360 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
10370 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77  nection.** and w
10380 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20  e are in shared 
10390 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
103a0 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66   the open will f
103b0 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  ail with an.** S
103c0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
103d0 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e   error.  We cann
103e0 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20  ot allow two or 
103f0 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a  more BtShared.**
10400 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
10410 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
10420 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64  nnection since d
10430 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61  oing so will lea
10440 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73  d.** to problems
10450 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   with locking..*
10460 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10470 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  eeOpen(.  sqlite
10480 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
10490 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
104a0 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20  for this b-tree 
104b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
104c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
104d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
104e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
104f0 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
10500 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
10510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10520 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
10530 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
10540 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
10550 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10560 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
10570 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
10580 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
10590 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
105a0 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
105b0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
105c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
105d0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
105e0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
105f0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42  Open() */.){.  B
10600 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
10610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
10620 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
10630 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
10640 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
10670 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
10680 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
10690 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
106a0 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
106b0 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
106c0 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
106d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
106e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
106f0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
10700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
10710 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
10740 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
10750 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
10760 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
10770 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
10780 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
10790 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72  tent */..  /* Tr
107a0 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e  ue if opening an
107b0 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70   ephemeral, temp
107c0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a  orary database *
107d0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  /.  const int is
107e0 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61  TempDb = zFilena
107f0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
10800 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  me[0]==0;..  /* 
10810 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
10820 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
10830 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
10840 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
10850 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
10860 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
10870 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  base..  */.#ifde
10880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
10890 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
108a0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
108b0 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e  #else.  const in
108c0 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69  t isMemdb = (zFi
108d0 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70  lename && strcmp
108e0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
108f0 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20  mory:")==0).    
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20     || (isTempDb 
10920 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  && sqlite3TempIn
10930 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20  Memory(db)).    
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10950 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20     || (vfsFlags 
10960 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  & SQLITE_OPEN_ME
10970 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
10980 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
10990 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
109a0 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Vfs!=0 );.  asse
109b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
109c0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
109d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
109e0 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61  flags&0xff)==fla
109f0 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73  gs );   /* flags
10a00 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a   fit in 8 bits *
10a10 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42  /..  /* Only a B
10a20 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
10a30 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45  base can be BTRE
10a40 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20  E_UNORDERED */. 
10a50 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
10a60 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  & BTREE_UNORDERE
10a70 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  D)==0 || (flags 
10a80 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21  & BTREE_SINGLE)!
10a90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54  =0 );..  /* A BT
10aa0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
10ab0 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ase is always a 
10ac0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72  temporary and/or
10ad0 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20   ephemeral */.  
10ae0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
10af0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d   BTREE_SINGLE)==
10b00 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b  0 || isTempDb );
10b10 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20  ..  if( isMemdb 
10b20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
10b30 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  BTREE_MEMORY;.  
10b40 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67  }.  if( (vfsFlag
10b50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
10b60 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28  MAIN_DB)!=0 && (
10b70 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d  isMemdb || isTem
10b80 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46  pDb) ){.    vfsF
10b90 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
10ba0 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
10bb0 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
10bc0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
10bd0 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
10be0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
10bf0 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
10c00 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
10c10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10c20 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
10c30 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
10c40 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
10c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10c60 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
10c70 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
10c80 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
10c90 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
10ca0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
10cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10cc0 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10cd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10ce0 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
10cf0 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
10d00 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
10d10 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
10d20 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
10d30 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
10d40 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
10d50 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
10d60 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
10d70 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
10d80 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
10d90 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
10da0 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
10db0 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
10dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
10dd0 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
10de0 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
10df0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
10e00 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
10e10 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
10e20 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
10e30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10e40 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
10e50 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
10e60 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
10e70 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
10e80 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
10e90 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
10ea0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
10eb0 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
10ec0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
10ed0 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
10ee0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
10ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10f00 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
10f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10f20 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
10f30 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20      if( isMemdb 
10f40 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
10f50 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  y(zFullPathname,
10f60 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c   zFilename, nFil
10f70 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
10f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
10f90 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
10fa0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
10fb0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
10fe0 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
10ff0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
11000 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
11020 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
11030 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
11040 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
11050 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11060 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11070 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
11080 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
11090 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
110a0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
110b0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
110c0 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
110d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
110e0 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
110f0 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
11100 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
11110 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11120 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
11130 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
11140 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
11150 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
11160 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
11170 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
11180 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
11190 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
111a0 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
111b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
111c0 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
111d0 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
111e0 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
111f0 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
11200 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
11210 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
11220 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
11230 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
11240 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
11250 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
11260 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
11270 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
11280 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
11290 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
112a0 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
112b0 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
112c0 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
112d0 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
112e0 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
112f0 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
11300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11310 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
11320 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
11330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
11340 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
11350 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
11360 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
11370 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
11380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
11390 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
113a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
113b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
113c0 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
113d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
113e0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
113f0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
11400 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
11410 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
11420 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
11430 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11440 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11450 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
11460 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11470 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
11480 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
11490 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
114a0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
114b0 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
114c0 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
114d0 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
114e0 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
114f0 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
11500 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
11510 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
11520 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
11530 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
11540 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
11550 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
11560 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
11570 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
11580 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
11590 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
115a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
115b0 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
115c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
115d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
115e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
115f0 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
11600 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
11610 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
11620 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
11630 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
11640 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
11650 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
11660 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
11670 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
11680 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
11690 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
116a0 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
116b0 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
116c0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
116d0 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20  of(i64)==8 );.  
116e0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
116f0 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (u64)==8 );.    
11700 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
11710 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
11720 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
11730 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
11740 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
11750 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
11760 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
11770 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
11780 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
11790 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
117a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
117b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
117c0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
117d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
117e0 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
117f0 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
11800 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
11830 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
11840 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
11850 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11870 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
11880 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
11890 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
118a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
118b0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
118c0 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
118d0 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
118e0 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
118f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11910 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
11920 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
11930 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
11940 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
11950 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
11960 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
11970 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
11980 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
11990 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
119a0 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
119b0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
119c0 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
119d0 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
119e0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
119f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11a00 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
11a10 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
11a20 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
11a30 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
11a40 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
11a50 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
11a60 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
11a70 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
11a80 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56  #endif.    /* EV
11a90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
11aa0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
11ab0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
11ac0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
11ad0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
11ae0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
11af0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
11b00 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
11b10 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
11b20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
11b30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11b40 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42   file. */.    pB
11b50 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a  t->pageSize = (z
11b60 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29  DbHeader[16]<<8)
11b70 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37   | (zDbHeader[17
11b80 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
11b90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
11ba0 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
11bb0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
11bc0 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
11bd0 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
11be0 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
11bf0 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
11c00 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
11c10 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
11c20 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11c30 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
11c40 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22  the magic name "
11c50 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63  :memory:" will c
11c60 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  reate an in-memo
11c70 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ry database, the
11c80 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65  n.      ** leave
11c90 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20   the autoVacuum 
11ca0 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f  mode at 0 (do no
11cb0 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20  t auto-vacuum), 
11cc0 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a  even if.      **
11cd0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
11ce0 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72  AUTOVACUUM is tr
11cf0 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  ue. On the other
11d00 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20   hand, if.      
11d10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ** SQLITE_OMIT_M
11d20 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e  EMORYDB has been
11d30 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22   defined, then "
11d40 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73  :memory:" is jus
11d50 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67  t a.      ** reg
11d60 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20  ular file-name. 
11d70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
11d80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70   auto-vacuum app
11d90 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d  lies as per norm
11da0 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
11db0 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
11dc0 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a   && !isMemdb ){.
11dd0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74          pBt->aut
11de0 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  oVacuum = (SQLIT
11df0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11e00 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20  CUUM ? 1 : 0);. 
11e10 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72         pBt->incr
11e20 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
11e30 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
11e40 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b  UUM==2 ? 1 : 0);
11e50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
11e60 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
11e70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
11e80 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
11e90 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
11ea0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
11eb0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
11ec0 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  on is.      ** d
11ed0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
11ee0 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
11ef0 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
11f00 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
11f10 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74   20.      ** int
11f20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
11f30 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
11f40 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
11f50 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20  zDbHeader[20];. 
11f60 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
11f70 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
11f80 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
11f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11fa0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
11fb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
11fc0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
11fd0 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
11fe0 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
11ff0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
12000 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
12010 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
12020 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
12030 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12040 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12050 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12060 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12070 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
12080 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
12090 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
120a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
120b0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
120c0 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
120d0 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
120e0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
120f0 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
12100 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
12110 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
12120 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12130 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12140 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
12150 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
12160 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
12170 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
12180 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
12190 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
121a0 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
121b0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
121c0 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
121d0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
121e0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
121f0 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
12200 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
12210 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
12220 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
12230 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12240 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12250 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
12260 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
12270 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
12280 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
12290 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
122a0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
122b0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
122c0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
122d0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
122e0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
122f0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
12300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12310 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
12320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12330 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
12340 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
12350 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
12360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
12370 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12380 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
12390 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74        pBt->pNext
123a0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
123b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
123c0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
123d0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
123e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
123f0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
12400 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
12410 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
12420 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d  exShared);.    }
12430 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
12440 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12450 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12460 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12480 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  IO).  /* If the 
12490 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61  new Btree uses a
124a0 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61   sharable pBtSha
124b0 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74  red, then link t
124c0 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65  he new.  ** Btre
124d0 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20  e into the list 
124e0 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20  of all sharable 
124f0 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73  Btrees for the s
12500 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ame connection..
12510 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73    ** The list is
12520 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69   kept in ascendi
12530 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20  ng order by pBt 
12540 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  address..  */.  
12550 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
12560 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12570 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20    Btree *pSib;. 
12580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
12590 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
125a0 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64     if( (pSib = d
125b0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d  b->aDb[i].pBt)!=
125c0 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61  0 && pSib->shara
125d0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ble ){.        w
125e0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65  hile( pSib->pPre
125f0 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62  v ){ pSib = pSib
12600 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20  ->pPrev; }.     
12610 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53     if( p->pBt<pS
12620 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
12630 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
12640 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
12650 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
12660 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
12670 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
12680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12690 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
126a0 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e  Next && pSib->pN
126b0 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20  ext->pBt<p->pBt 
126c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
126d0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
126e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
126f0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
12700 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
12710 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
12720 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
12730 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
12740 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
12750 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
12760 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
12770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
12780 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
12790 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
127a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
127b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
127c0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
127d0 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
127e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
127f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
12800 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
12810 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
12820 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
12830 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
12840 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
12850 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
12860 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12870 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
12880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
12890 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61  If the B-Tree wa
128a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
128b0 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70  pened, set the p
128c0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20  ager-cache size 
128d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65  to the.    ** de
128e0 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63  fault value. Exc
128f0 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e  ept, when openin
12900 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67  g on an existing
12910 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61   shared pager-ca
12920 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e  che,.    ** do n
12930 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
12940 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a  ger-cache size..
12950 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
12960 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
12970 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  a(p, 0, 0)==0 ){
12980 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
12990 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
129a0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
129b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
129c0 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ACHE_SIZE);.    
129d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
129e0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
129f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12a00 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
12a10 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
12a20 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12a30 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
12a40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12a50 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
12a60 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
12a70 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
12a80 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
12a90 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
12aa0 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
12ab0 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
12ac0 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
12ad0 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
12ae0 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
12af0 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
12b00 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
12b10 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
12b20 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
12b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
12b40 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
12b50 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
12b60 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
12b70 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12b80 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  CHE.  MUTEX_LOGI
12b90 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
12ba0 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42   *pMaster; ).  B
12bb0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
12bc0 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
12bd0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
12be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
12bf0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12c00 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  );.  MUTEX_LOGIC
12c10 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
12c20 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12c30 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12c40 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
12c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12c60 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70  er(pMaster);.  p
12c70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Bt->nRef--;.  if
12c80 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pBt->nRef<=0 )
12c90 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c  {.    if( GLOBAL
12ca0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12cb0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12cc0 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  t)==pBt ){.     
12cd0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
12ce0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
12cf0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d  acheList) = pBt-
12d00 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
12d10 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  e{.      pList =
12d20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
12d30 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
12d40 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
12d50 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70   while( ALWAYS(p
12d60 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e  List) && pList->
12d70 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20  pNext!=pBt ){.  
12d80 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73        pList=pLis
12d90 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
12da0 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  }.      if( ALWA
12db0 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20  YS(pList) ){.   
12dc0 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78       pList->pNex
12dd0 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
12de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12df0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
12e00 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20  EADSAFE ){.     
12e10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
12e20 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b  ree(pBt->mutex);
12e30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76  .    }.    remov
12e40 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  ed = 1;.  }.  sq
12e50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12e60 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
12e70 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65  turn removed;.#e
12e80 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  lse.  return 1;.
12e90 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12ea0 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70  Make sure pBt->p
12eb0 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20  TmpSpace points 
12ec0 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  to an allocation
12ed0 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f   of .** MX_CELL_
12ee0 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20  SIZE(pBt) bytes 
12ef0 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72  with a 4-byte pr
12f00 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d  efix for a left-
12f10 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72  child.** pointer
12f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12f30 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
12f40 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
12f50 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
12f60 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
12f70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
12f80 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
12f90 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
12fa0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
12fb0 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
12fc0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
12fd0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
12fe0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
12ff0 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
13000 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
13010 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
13020 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
13030 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
13040 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
13050 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
13060 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
13070 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
13080 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
13090 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
130a0 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
130b0 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
130c0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
130d0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
130e0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
130f0 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
13100 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
13110 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
13120 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
13130 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
13140 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
13150 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
13160 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
13170 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
13180 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
13190 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
131a0 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
131b0 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
131c0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
131d0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
131e0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
131f0 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
13200 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
13210 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
13220 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
13230 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
13240 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a  ce here..    **.
13250 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72      ** Also:  Pr
13260 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73  ovide four bytes
13270 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
13280 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65  space before the
13290 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e  .    ** beginnin
132a0 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61  g of pTmpSpace a
132b0 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61  s an area availa
132c0 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74  ble to prepend t
132d0 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63  he.    ** left-c
132e0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  hild pointer to 
132f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13300 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a   a cell..    */.
13310 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
13320 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
13330 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70  memset(pBt->pTmp
13340 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20  Space, 0, 8);.  
13350 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
13360 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  ce += 4;.    }. 
13370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
13380 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
13390 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
133a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
133b0 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
133c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
133d0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
133e0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
133f0 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20  pSpace -= 4;.   
13400 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
13410 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29  (pBt->pTmpSpace)
13420 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  ;.    pBt->pTmpS
13430 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  pace = 0;.  }.}.
13440 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
13450 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
13460 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
13470 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
13480 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13490 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
134a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
134b0 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
134c0 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
134d0 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
134e0 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
134f0 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
13500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
13510 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
13520 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
13530 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13540 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
13550 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
13560 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
13570 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
13580 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
13590 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
135a0 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
135b0 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
135c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
135d0 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
135e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
135f0 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
13600 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
13610 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
13620 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
13630 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
13640 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
13650 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
13660 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
13670 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
13680 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
13690 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
136a0 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  k(p, SQLITE_OK, 
136b0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  0);.  sqlite3Btr
136c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
136d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
136e0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
136f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
13700 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
13710 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
13720 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
13730 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
13740 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
13750 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
13760 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
13770 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
13780 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
13790 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
137a0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
137b0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
137c0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
137d0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
137e0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
137f0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
13800 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
13810 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
13820 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
13830 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
13840 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
13850 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
13860 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
13870 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
13880 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
13890 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
138a0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
138b0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
138c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
138d0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
138e0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
138f0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
13900 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
13910 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
13920 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13930 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
13940 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
13950 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
13960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
13970 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
13980 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
13990 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
139a0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
139b0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
139c0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
139d0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
139e0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
139f0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
13a00 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
13a10 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
13a20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
13a30 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
13a40 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
13a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13a60 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
13a70 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
13a80 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
13a90 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
13aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
13ab0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
13ac0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
13ad0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
13ae0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
13af0 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
13b00 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
13b10 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
13b20 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
13b30 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
13b40 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
13b50 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
13b60 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
13b70 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
13b80 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
13b90 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
13ba0 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
13bb0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
13bc0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
13bd0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
13be0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
13bf0 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
13c00 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
13c10 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
13c20 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
13c30 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
13c40 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
13c50 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
13c60 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
13c70 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
13c80 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
13c90 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
13ca0 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
13cb0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
13cc0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
13cd0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
13ce0 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
13cf0 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
13d00 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
13d10 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
13d20 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
13d30 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
13d40 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
13d50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13d60 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
13d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13d80 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
13d90 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
13da0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
13db0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
13dc0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
13dd0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
13de0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13df0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
13e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
13e10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
13e20 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61  SIZE>0./*.** Cha
13e30 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13e40 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
13e50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13e60 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
13e70 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a  memory mapped..*
13e80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13e90 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42  eeSetMmapLimit(B
13ea0 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tree *p, sqlite3
13eb0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
13ec0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13ed0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13ef0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13f00 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13f10 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13f20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f30 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e  tMmapLimit(pBt->
13f40 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b  pPager, szMmap);
13f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
13f60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
13f70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13f80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
13f90 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
13fa0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
13fb0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
13fc0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
13fd0 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
13fe0 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
13ff0 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
14000 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
14010 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
14020 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
14030 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
14040 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
14050 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
14060 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
14070 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
14080 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
14090 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
140a0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
140b0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
140c0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
140d0 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
140e0 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
140f0 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
14100 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
14110 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
14120 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
14130 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
14140 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
14150 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
14160 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14170 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
14180 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
14190 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
141a0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  s(.  Btree *p,  
141b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
141c0 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20  he btree to set 
141d0 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c  the safety level
141e0 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   on */.  unsigne
141f0 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20  d pgFlags       
14200 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52  /* Various PAGER
14210 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  _* flags */.){. 
14220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14230 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
14240 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14250 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
14260 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
14270 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14280 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14290 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
142a0 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73  r, pgFlags);.  s
142b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
142c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
142d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
142e0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
142f0 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
14300 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74  n btree is set t
14310 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31  o safety level 1
14320 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  .  In other.** w
14330 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
14340 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f  E if no sync() o
14350 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73  ccurs on the dis
14360 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  k files..*/.int 
14370 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
14380 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a  Disabled(Btree *
14390 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
143a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
143b0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
143c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
143d0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
143e0 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65  x) );  .  sqlite
143f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14400 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26    assert( pBt &&
14410 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a   pBt->pPager );.
14420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14430 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70  gerNosync(pBt->p
14440 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
14450 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14470 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
14480 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
14490 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
144a0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
144b0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
144c0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
144d0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
144e0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
144f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
14500 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
14510 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
14520 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
14530 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
14540 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
14550 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
14560 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
14570 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
14580 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
14590 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
145a0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
145b0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
145c0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
145d0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
145e0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
145f0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
14600 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
14610 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
14620 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
14630 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
14640 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
14650 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
14660 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
14670 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
14680 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
14690 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
146a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
146b0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
146c0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
146d0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
146e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
146f0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
14700 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
14710 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
14720 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
14730 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
14740 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
14750 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
14760 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
14770 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
14780 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
14790 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
147a0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
147b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
147c0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
147d0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
147e0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
147f0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
14800 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14810 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
14820 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
14830 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
14840 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
14850 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
14860 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
14870 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
14880 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
14890 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
148a0 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
148b0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
148c0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
148d0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
148e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
148f0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
14900 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14910 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
14920 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
14930 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
14940 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
14950 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
14960 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
14970 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
14980 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
14990 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
149a0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
149b0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
149c0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
149d0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
149e0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
149f0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
14a00 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
14a10 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
14a20 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
14a30 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
14a40 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
14a50 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
14a60 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
14a70 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
14a80 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
14a90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14aa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14ab0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14ac0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14ad0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14ae0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
14af0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
14b00 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
14b10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
14b20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
14b30 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
14b40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14b60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
14b70 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
14b80 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
14b90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14ba0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
14bb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
14bc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
14bd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14be0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
14bf0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
14c00 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
14c10 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
14c20 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
14c30 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
14c40 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
14c50 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
14c60 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
14c70 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
14c80 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
14c90 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
14ca0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
14cb0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
14cc0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
14cd0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
14ce0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
14cf0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
14d00 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
14d10 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
14d20 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
14d30 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
14d40 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
14d50 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
14d60 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
14d70 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
14d80 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
14d90 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
14da0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
14db0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
14dc0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
14dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14de0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
14df0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
14e00 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
14e10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
14e20 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
14e30 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
14e40 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14e50 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
14e60 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
14e70 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
14e80 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
14e90 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
14ea0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
14eb0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
14ec0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
14ed0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
14ee0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
14ef0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
14f00 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
14f10 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
14f20 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
14f30 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
14f40 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
14f50 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
14f60 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
14f70 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
14f80 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
14f90 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
14fa0 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
14fb0 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
14fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14fd0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
14fe0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
14ff0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
15000 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15010 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
15020 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
15030 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
15040 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15050 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
15060 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
15070 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
15080 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
15090 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
150a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
150b0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
150c0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
150d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
150e0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
150f0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
15100 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
15110 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
15120 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
15130 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
15140 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
15150 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
15160 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
15170 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
15180 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
15190 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
151a0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
151b0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
151c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
151d0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
151e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
151f0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
15200 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
15210 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15220 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
15230 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15240 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
15250 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
15260 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
15270 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
15280 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
15290 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
152a0 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
152b0 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
152c0 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
152d0 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
152e0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
152f0 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
15300 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
15310 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
15320 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
15330 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
15340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15350 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
15360 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
15370 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
15380 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
15390 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
153a0 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
153b0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
153c0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
153d0 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
153e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
153f0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
15400 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
15410 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15420 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
15430 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
15440 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
15450 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
15460 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
15470 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
15480 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
15490 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
154a0 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
154b0 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
154c0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
154d0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
154e0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
154f0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
15500 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
15510 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
15520 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15530 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
15540 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15550 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
15560 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
15570 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
15580 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15590 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
155a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
155b0 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
155c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
155d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
155e0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
155f0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
15600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15610 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
15620 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15630 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
15640 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
15650 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
15660 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
15670 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15690 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
156a0 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
156b0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
156c0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
156d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
156e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
156f0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
15700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15710 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
15720 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
15730 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
15740 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
15750 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
15760 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
15770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15780 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
15790 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
157a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
157b0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
157c0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
157d0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
157e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
157f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15800 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
15810 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
15820 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
15830 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
15840 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
15850 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
15860 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
15870 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
15880 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
15890 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
158a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
158b0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
158c0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
158d0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
158e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
158f0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
15900 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
15910 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
15920 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
15930 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
15940 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
15950 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
15960 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
15970 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
15980 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
15990 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
159a0 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
159b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
159c0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
159d0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
159e0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
159f0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
15a00 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
15a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
15a20 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
15a30 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a50 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
15a60 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
15a70 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
15a80 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
15a90 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
15aa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
15ab0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
15ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
15ad0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
15ae0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
15af0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
15b00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
15b10 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
15b20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
15b30 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
15b40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15b50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
15b60 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
15b70 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
15b80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15b90 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
15ba0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
15bb0 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
15bc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
15bd0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
15be0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
15bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15c00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15c10 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
15c20 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
15c30 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
15c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15c50 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
15c60 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
15c70 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
15c80 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
15c90 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
15ca0 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
15cb0 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
15cc0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
15cd0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
15ce0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
15cf0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
15d00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
15d10 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
15d20 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
15d30 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
15d40 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
15d50 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
15d60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
15d70 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
15d80 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
15d90 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
15da0 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
15db0 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
15dc0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
15dd0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
15de0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
15df0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
15e00 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
15e10 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
15e20 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
15e30 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
15e40 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
15e50 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
15e60 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
15e70 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
15e80 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
15e90 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
15ea0 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
15eb0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
15ec0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
15ed0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
15ee0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
15ef0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
15f00 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
15f10 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
15f20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
15f30 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
15f40 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
15f50 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
15f60 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
15f70 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
15f80 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15f90 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
15fa0 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
15fb0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
15fc0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15fd0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
15fe0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
15ff0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
16000 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
16010 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
16020 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
16030 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
16040 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
16050 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
16060 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
16070 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
16080 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
16090 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
160a0 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
160b0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
160c0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
160d0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
160e0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
160f0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
16100 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
16110 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
16120 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
16130 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
16140 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
16150 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
16160 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
16170 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
16180 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
16190 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
161a0 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
161b0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
161c0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
161d0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
161e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
161f0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
16200 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16210 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
16220 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
16230 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
16240 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
16250 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
16260 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
16270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
16290 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
162a0 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
162b0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
162c0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
162d0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
162e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
162f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
16300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16310 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
16320 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16330 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
16340 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
16350 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
16360 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
16370 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
16380 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
16390 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
163a0 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
163b0 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
163c0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
163d0 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
163e0 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
163f0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
16400 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
16410 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
16420 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
16430 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
16440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
16450 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
16460 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
16470 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
16480 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
16490 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
164a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
164b0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
164c0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
164d0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
164e0 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
164f0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
16500 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
16510 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
16520 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
16530 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
16540 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
16550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
16560 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
16570 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
16580 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
16590 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
165a0 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
165b0 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
165c0 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
165d0 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
165e0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
165f0 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
16600 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
16610 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
16620 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
16630 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
16640 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
16650 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
16660 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
16670 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
16680 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
16690 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
166a0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
166b0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
166c0 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
166d0 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
166e0 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
166f0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
16700 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
16710 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
16720 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16730 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
16740 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
16750 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
16760 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
16770 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
16780 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
16790 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
167a0 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
167b0 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
167c0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
167d0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
167e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
167f0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
16800 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
16810 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
16820 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
16830 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
16840 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
16850 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
16860 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
16870 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
16880 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
16890 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
168a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
168b0 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
168c0 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
168d0 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
168e0 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
168f0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
16900 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
16910 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
16920 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
16930 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
16940 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
16950 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
16960 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
16970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
16980 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
16990 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
169a0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
169b0 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
169c0 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
169d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
169e0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
169f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
16a00 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
16a10 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
16a20 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
16a30 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
16a40 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
16a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16a60 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
16a70 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
16a80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
16ac0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
16ad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16ae0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
16af0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
16b00 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
16b10 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
16b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
16b30 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
16b40 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
16b50 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
16b60 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
16b70 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16b80 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
16b90 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
16ba0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
16bb0 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
16bc0 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
16bd0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
16be0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
16bf0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
16c00 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
16c10 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
16c20 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
16c30 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
16c40 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
16c50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
16c60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
16c70 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
16c80 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
16c90 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
16ca0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
16cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16cc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
16cd0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
16ce0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
16cf0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
16d00 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
16d10 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
16d20 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
16d30 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
16d40 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
16d50 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
16d60 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
16d70 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
16d80 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
16d90 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
16da0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
16db0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
16dc0 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
16dd0 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
16de0 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
16df0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
16e00 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
16e10 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
16e20 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
16e30 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
16e40 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
16e50 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
16e60 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
16e70 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
16e80 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
16e90 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
16ea0 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
16eb0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
16ec0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
16ed0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
16ee0 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
16ef0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
16f00 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
16f10 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
16f20 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
16f30 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
16f40 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
16f50 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
16f60 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
16f70 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
16f80 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
16f90 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
16fa0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
16fb0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
16fc0 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
16fd0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
16fe0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
16ff0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
17000 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
17010 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
17020 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
17030 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
17040 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
17050 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
17060 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
17070 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
17080 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
17090 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
170a0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
170b0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
170c0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
170d0 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
170e0 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
170f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
17100 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
17110 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
17120 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
17130 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
17140 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
17150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17160 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
17170 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
17180 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
17190 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
171a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
171b0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
171c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
171d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
171e0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
171f0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
17200 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
17210 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
17220 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
17230 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
17240 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
17250 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
17260 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
17270 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
17280 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
17290 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
172a0 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
172b0 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
172c0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
172d0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
172e0 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
172f0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
17300 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
17310 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
17320 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
17330 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20  abase.  Cursors 
17340 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
17350 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
17360 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
17370 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
17380 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
17390 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
173a0 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
173b0 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
173c0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
173d0 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
173e0 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
173f0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
17400 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
17410 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
17420 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
17430 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
17440 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
17450 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
17460 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
17470 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
17480 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
17490 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
174a0 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
174b0 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
174c0 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
174d0 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
174e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
174f0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
17500 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
17510 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
17520 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
17530 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
17540 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
17550 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
17560 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
17570 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
17580 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
17590 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
175a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
175b0 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
175c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
175d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
175e0 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
175f0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
17600 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
17610 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17620 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
17640 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
17650 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
17660 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
17670 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
17680 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
17690 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
176a0 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
176b0 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50  1!=0 ){.    MemP
176c0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
176d0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61  t->pPage1;.    a
176e0 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61  ssert( pPage1->a
176f0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
17700 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
17710 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
17720 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
17730 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
17740 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
17750 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
17760 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
17770 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
17780 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
17790 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
177a0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
177b0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
177c0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
177d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
177e0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
177f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17800 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
17810 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
17820 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
17830 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
17840 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
17850 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17860 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17870 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
17880 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
17890 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
178a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
178b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
178c0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
178d0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
178e0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
178f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17900 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
17910 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
17920 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
17930 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
17940 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
17950 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
17960 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
17970 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
17980 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
17990 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
179a0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
179b0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
179c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
179d0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
179e0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
179f0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
17a00 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
17a10 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
17a20 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
17a30 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
17a40 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
17a50 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
17a60 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
17a70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
17a80 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
17a90 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
17aa0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
17ab0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
17ac0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
17ad0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
17ae0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
17af0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
17b00 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
17b10 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
17b20 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
17b30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17b40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
17b50 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
17b60 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
17b70 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
17b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
17b90 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
17ba0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
17bb0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
17bc0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
17bd0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
17be0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
17bf0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
17c00 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
17c10 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
17c20 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
17c30 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
17c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
17c60 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
17c70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
17c80 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
17c90 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
17ca0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
17cb0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
17cc0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
17cd0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
17ce0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
17cf0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
17d00 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
17d10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
17d20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
17d30 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
17d40 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17d50 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17d60 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
17d70 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
17d80 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
17d90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17da0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17db0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17dc0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
17dd0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
17de0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
17df0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
17e00 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
17e10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
17e20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
17e30 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
17e40 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
17e50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
17e60 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
17e70 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
17e80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17e90 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
17ea0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
17eb0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
17ec0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
17ed0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
17ee0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
17ef0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
17f00 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
17f10 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
17f20 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
17f30 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
17f40 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
17f50 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
17f60 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
17f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
17f80 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
17f90 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
17fa0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
17fb0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
17fc0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
17fd0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
17fe0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17ff0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
18000 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
18010 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
18020 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
18030 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
18040 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
18050 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
18060 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
18070 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
18080 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
18090 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
180a0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
180b0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
180c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
180d0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
180e0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
180f0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
18100 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
18110 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
18120 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
18130 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
18140 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
18150 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
18160 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
18170 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
18180 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
18190 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
181a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
181b0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
181c0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
181d0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
181e0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
181f0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
18200 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
18210 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
18220 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
18230 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
18240 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
18250 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
18260 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
18270 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
18280 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
18290 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
182a0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
182b0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
182c0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
182d0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
182e0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
182f0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
18300 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
18310 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
18320 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
18330 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
18340 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
18350 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
18360 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
18370 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
18380 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
18390 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
183a0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
183b0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
183c0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
183d0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
183e0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
183f0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
18400 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
18410 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
18420 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
18430 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
18440 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
18450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18460 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
18470 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
18480 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
18490 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
184a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
184b0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
184c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
184d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
184e0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
184f0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
18500 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
18510 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
18520 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
18530 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
18540 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
18550 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
18560 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
18570 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
18580 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
18590 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
185a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
185b0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
185c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
185d0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
185e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
185f0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
18600 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18610 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18620 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
18630 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
18640 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
18650 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
18660 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
18670 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
18680 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
18690 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
186a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
186b0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
186c0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
186d0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
186e0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
186f0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
18700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18710 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
18720 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
18730 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
18740 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
18750 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
18760 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
18770 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
18780 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
18790 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
187a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
187b0 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
187c0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
187d0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
187e0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
187f0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
18800 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20  NS_WRITE).   || 
18810 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
18820 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
18830 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  .  ){.    pBlock
18840 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
18850 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >db;.  }else if(
18860 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
18870 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
18880 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
18890 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
188a0 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
188b0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
188c0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
188d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f   ){.        pBlo
188e0 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
188f0 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
18900 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18910 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
18920 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Block ){.    sql
18930 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
18940 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
18950 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ock);.    rc = S
18960 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
18970 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f  REDCACHE;.    go
18980 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
18990 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
189a0 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
189b0 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
189c0 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
189d0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
189e0 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
189f0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
18a00 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
18a10 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
18a20 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
18a30 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
18a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
18a50 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
18a60 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
18a70 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18a80 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
18a90 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
18aa0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18ab0 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
18ac0 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
18ad0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
18ae0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
18af0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
18b00 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
18b10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
18b20 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
18b30 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
18b40 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
18b50 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
18b60 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
18b70 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
18b80 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
18b90 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
18ba0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
18bb0 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
18bc0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
18bd0 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
18be0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
18bf0 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
18c00 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
18c10 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
18c20 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
18c30 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
18c40 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
18c50 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
18c60 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
18c70 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
18c80 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
18c90 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
18ca0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
18cb0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
18cc0 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
18cd0 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
18ce0 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
18cf0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
18d00 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
18d10 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
18d20 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
18d30 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
18d40 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
18d50 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
18d60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
18d70 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
18d80 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
18d90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18da0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
18db0 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
18dc0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
18dd0 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
18de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e00 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
18e10 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
18e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18e30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
18e40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e50 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
18e60 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
18e70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
18e80 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
18e90 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
18ea0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
18eb0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
18ec0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
18ed0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
18ee0 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
18ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18f00 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
18f10 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
18f20 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
18f30 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
18f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18f50 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
18f60 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
18f70 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
18f80 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
18f90 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
18fa0 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
18fb0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
18fc0 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
18fd0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
18fe0 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
18ff0 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
19000 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
19010 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
19020 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
19030 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
19040 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
19050 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
19060 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19070 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
19080 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
19090 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
190a0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
190b0 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
190c0 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
190d0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
190e0 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
190f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19100 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
19110 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
19120 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
19130 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
19140 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
19150 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
19160 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
19170 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
19180 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
19190 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
191a0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
191b0 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
191c0 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
191d0 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
191e0 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
191f0 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
19200 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
19210 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
19220 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
19230 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
19240 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
19250 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
19260 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
19270 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
19280 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
19290 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
192a0 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
192b0 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
192c0 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
192d0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
192e0 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
192f0 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
19300 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
19310 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
19320 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
19330 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
19340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19350 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19360 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
19370 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
19380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19390 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
193a0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
193b0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
193c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
193d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
193e0 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
193f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19400 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
19410 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
19420 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
19430 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
19440 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
19450 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
19460 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
19470 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
19480 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
19490 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
194a0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
194b0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
194c0 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
194d0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
194e0 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
194f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19500 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
19510 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
19520 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
19530 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
19540 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
19550 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19560 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19570 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19580 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19590 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
195a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
195b0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
195c0 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
195d0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
195e0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
195f0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
19600 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
19610 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
19620 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
19630 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
19640 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
19650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19660 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
19670 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
19680 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
196b0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
196c0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
196d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
196f0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
19700 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19730 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
19740 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19750 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
19760 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
19770 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
19780 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
19790 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
197a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
197b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
197c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
197d0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
197e0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
197f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19800 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
19810 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
19820 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
19830 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
19840 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
19850 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
19860 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
19870 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
19880 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
19890 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
198a0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
198b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
198c0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
198d0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
198e0 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
198f0 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
19900 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
19910 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
19920 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
19930 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
19940 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
19950 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
19960 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
19970 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
19980 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
19990 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
199a0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
199b0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
199c0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
199d0 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
199e0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
199f0 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
19a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
19a10 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
19a20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
19a30 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
19a40 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
19a50 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
19a60 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
19a70 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
19a80 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
19a90 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
19aa0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
19ab0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
19ac0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
19ad0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
19ae0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
19af0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
19b00 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
19b10 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
19b20 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
19b30 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
19b40 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
19b50 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
19b60 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
19b70 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
19ba0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
19bb0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
19bc0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
19bd0 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
19be0 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
19bf0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
19c00 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
19c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19c20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
19c30 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
19c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
19c50 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
19c60 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
19c70 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
19c80 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
19c90 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19cb0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
19cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
19cd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
19ce0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
19cf0 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
19d00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
19d10 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
19d20 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
19d30 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
19d40 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
19d50 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
19d60 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
19d70 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
19d80 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
19d90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19da0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19db0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
19dc0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
19dd0 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
19de0 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
19df0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
19e00 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
19e10 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
19e20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
19e30 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
19e40 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
19e50 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
19e60 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
19e70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
19e80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
19e90 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
19ea0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
19eb0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
19ec0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
19ed0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
19ee0 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
19ef0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
19f00 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
19f10 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
19f20 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
19f30 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
19f40 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
19f50 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
19f60 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
19f70 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
19f80 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
19f90 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
19fa0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
19fb0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
19fc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19fd0 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
19fe0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
19ff0 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
1a000 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a010 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1a020 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1a030 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1a040 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1a050 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1a060 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1a070 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1a080 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1a090 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1a0a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1a0b0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1a0c0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1a0d0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1a0e0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1a0f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1a100 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1a110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a120 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1a130 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1a140 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1a150 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1a160 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1a170 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
1a180 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1a190 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
1a1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1a1b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1a1c0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1a1d0 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1a1e0 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1a1f0 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1a200 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1a210 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1a220 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1a230 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1a240 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1a250 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1a260 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1a270 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1a280 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1a290 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1a2a0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1a2b0 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1a2c0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1a2d0 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1a2e0 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1a2f0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1a300 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1a310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1a320 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1a330 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1a340 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1a350 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1a360 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1a370 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1a380 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3a0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1a3b0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1a3c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1a3d0 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1a3e0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1a3f0 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1a400 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1a410 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1a420 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1a430 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1a440 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1a450 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1a460 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1a470 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1a480 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1a490 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1a4a0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1a4b0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1a4c0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1a4d0 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1a4e0 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1a4f0 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1a500 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1a510 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1a520 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1a530 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1a540 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1a550 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1a560 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1a570 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1a580 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1a590 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1a5a0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1a5b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a5c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1a5d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1a5e0 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1a5f0 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1a600 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1a610 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1a620 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1a630 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1a640 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1a650 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1a660 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1a670 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1a680 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1a690 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1a6a0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1a6b0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1a6c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a6d0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1a6e0 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1a6f0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1a700 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1a710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a720 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1a730 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1a740 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1a750 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1a760 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1a770 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1a780 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1a790 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1a7a0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1a7b0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1a7c0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1a7d0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1a7e0 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1a7f0 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1a800 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1a810 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1a820 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1a830 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1a840 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1a850 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1a860 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1a870 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1a880 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1a890 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1a8a0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1a8b0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1a8c0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1a8d0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1a8e0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1a8f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1a900 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1a910 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1a920 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1a930 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1a940 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1a950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a960 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a980 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1a990 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1a9a0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1a9b0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1a9c0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1a9d0 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1a9e0 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1a9f0 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1aa00 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1aa10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1aa30 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1aa40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1aa50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1aa60 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1aa70 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1aa80 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1aa90 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1aaa0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1aab0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1aac0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1aad0 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1aae0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1aaf0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1ab00 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1ab10 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1ab20 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1ab30 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1ab40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ab50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1ab60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ab70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ab80 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1ab90 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1aba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1abb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1abc0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1abd0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1abe0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1abf0 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1ac00 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1ac10 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1ac20 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1ac30 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1ac40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1ac50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ac60 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1ac70 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1ac80 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1ac90 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1aca0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1acb0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1acc0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1acd0 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1ace0 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1acf0 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1ad00 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1ad10 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1ad20 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1ad30 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1ad40 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1ad50 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1ad60 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1ad70 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1ad80 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1ad90 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1ada0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1adb0 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1adc0 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1add0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1ade0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1adf0 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1ae00 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1ae10 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1ae20 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1ae30 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1ae40 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1ae50 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1ae60 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1ae70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1ae80 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1ae90 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1aea0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1aeb0 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1aec0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1aed0 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1aee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1aef0 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1af00 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1af10 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1af20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1af30 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1af40 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1af50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1af60 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1af70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1af80 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1af90 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1afa0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1afb0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1afc0 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1afd0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1afe0 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1aff0 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1b000 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1b010 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1b020 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1b030 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1b040 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1b050 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1b060 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1b070 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1b080 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1b090 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1b0a0 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1b0b0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1b0c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1b0d0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1b0e0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1b0f0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1b100 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1b110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b120 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1b130 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1b140 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1b150 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1b160 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1b170 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1b180 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1b190 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1b1a0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1b1b0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1b1c0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1b1d0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1b1e0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1b1f0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1b200 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b210 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1b220 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1b230 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1b240 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1b250 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1b260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b270 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b280 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1b290 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1b2a0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1b2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1b2c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1b2d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1b2e0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1b2f0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1b300 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1b310 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1b320 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1b330 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1b340 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1b350 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1b360 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1b370 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1b380 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1b390 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1b3a0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1b3b0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1b3c0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1b3d0 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1b3e0 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1b3f0 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1b400 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1b410 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1b420 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1b430 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1b440 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1b450 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1b460 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1b470 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1b480 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1b490 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1b4a0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1b4b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b4c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b4e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1b4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1b500 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1b510 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1b520 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1b530 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1b540 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1b550 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1b560 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1b570 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1b580 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1b590 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b5a0 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1b5b0 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1b5c0 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1b5d0 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1b5e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b5f0 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1b600 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1b610 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1b620 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1b630 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1b640 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1b650 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1b660 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1b670 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1b680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1b6a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1b6b0 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1b6c0 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1b6d0 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1b6e0 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1b6f0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1b700 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1b710 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1b720 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1b730 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1b740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1b750 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1b760 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1b770 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b780 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1b790 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1b7a0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1b7b0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1b7c0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1b7d0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1b7e0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1b7f0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1b800 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1b810 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1b820 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1b830 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1b840 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1b850 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1b860 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1b870 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1b880 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1b890 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1b8a0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1b8b0 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1b8c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b8e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1b8f0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1b900 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b920 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1b930 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1b940 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1b950 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1b960 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1b970 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1b980 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1b990 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1b9a0 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1b9b0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1b9c0 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1b9d0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1b9e0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1b9f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1ba00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ba10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ba20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1ba30 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1ba40 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1ba50 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1ba60 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1ba70 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1ba80 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1ba90 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1baa0 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1bab0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1bac0 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1bad0 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1bae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1baf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1bb00 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1bb10 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1bb20 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1bb30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1bb40 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1bb50 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1bb60 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1bb70 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1bb80 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1bb90 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1bba0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1bbb0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1bbc0 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1bbd0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1bbe0 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1bbf0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1bc00 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1bc10 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1bc20 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bc40 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1bc50 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1bc60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1bc70 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1bc80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bc90 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1bca0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1bcb0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcd0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1bce0 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1bcf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1bd00 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1bd10 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1bd20 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1bd30 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1bd40 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1bd50 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1bd60 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1bd70 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1bd80 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1bd90 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1bda0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1bdb0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1bdc0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1bdd0 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1bde0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1bdf0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1be00 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1be10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1be20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1be30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1be40 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1be50 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1be60 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1be70 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1be80 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1be90 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1bea0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1beb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1bec0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1bed0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1bee0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1bef0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1bf00 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1bf10 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1bf20 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1bf30 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1bf40 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1bf50 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1bf60 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1bf70 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1bf80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bf90 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1bfa0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1bfb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1bfc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1bfd0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bfe0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1bff0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c000 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1c010 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c020 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1c030 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1c040 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1c050 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1c060 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1c070 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1c080 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1c090 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1c0a0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c0b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1c0c0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1c0d0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1c0e0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1c0f0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1c100 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1c110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1c120 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1c130 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1c140 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1c150 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1c160 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1c170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c180 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1c190 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1c1a0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1c1b0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1c1c0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1c1d0 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1c1e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1c1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c210 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1c220 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1c230 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1c240 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1c250 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1c260 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1c270 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1c280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c290 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1c2a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1c2b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1c2c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c2d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1c2e0 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1c2f0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1c300 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1c310 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1c320 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1c330 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1c340 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1c350 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1c360 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1c370 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1c380 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1c390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3a0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1c3b0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1c3c0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1c3d0 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1c3e0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1c3f0 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1c400 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1c410 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1c420 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1c430 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1c440 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1c450 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1c460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1c470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1c480 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1c490 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1c4a0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1c4b0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1c4c0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  unt(pPager) );..
1c4d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1c4e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1c4f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1c500 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1c510 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1c520 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1c530 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1c540 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1c550 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1c560 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1c570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1c580 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1c590 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1c5a0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1c5b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c5c0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1c5d0 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1c5e0 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1c5f0 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1c600 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1c610 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1c620 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1c630 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c640 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1c650 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1c660 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1c670 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1c680 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1c690 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1c6a0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1c6b0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1c6c0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1c6d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1c6e0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1c6f0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1c700 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1c710 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1c720 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1c730 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1c740 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1c750 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1c760 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1c770 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1c780 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1c790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1c7a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c7b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1c7c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1c7d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c7e0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1c7f0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1c800 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1c810 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1c820 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1c830 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1c840 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1c850 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1c860 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1c870 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1c880 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1c890 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1c8a0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1c8b0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1c8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1c8d0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1c8e0 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1c8f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1c900 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c910 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1c920 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1c930 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c940 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1c950 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1c960 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1c970 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1c980 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1c990 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1c9a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1c9b0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1c9c0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1c9d0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1c9e0 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1c9f0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1ca00 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1ca10 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1ca20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1ca30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ca40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ca50 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1ca60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ca70 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1ca80 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1ca90 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1caa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1cab0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1cac0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1cad0 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1cae0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1caf0 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1cb00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1cb10 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1cb20 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
1cb30 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
1cb40 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
1cb50 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
1cb60 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1cb70 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
1cb80 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
1cb90 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
1cba0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
1cbb0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
1cbc0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
1cbd0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
1cbe0 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
1cbf0 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
1cc00 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
1cc10 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
1cc20 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
1cc30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
1cc40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1cc50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1cc60 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1cc70 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1cc80 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1cc90 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1cca0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1ccb0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1ccc0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1ccd0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1cce0 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1ccf0 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1cd00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1cd10 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1cd20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1cd30 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1cd40 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1cd50 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1cd60 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1cd70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cd80 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1cd90 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1cda0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1cdb0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1cdc0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1cdd0 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1cde0 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1cdf0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1ce00 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1ce10 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1ce20 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1ce30 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1ce40 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1ce50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1ce60 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1ce70 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1ce80 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1ce90 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1cea0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1ceb0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1cec0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1ced0 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1cee0 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1cef0 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1cf00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1cf10 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1cf20 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1cf30 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1cf40 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1cf50 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1cf60 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1cf70 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1cf80 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1cf90 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1cfa0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1cfb0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1cfc0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1cfd0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1cfe0 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1cff0 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1d000 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1d010 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1d020 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1d030 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1d040 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d050 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1d060 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1d070 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1d080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1d090 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
1d0a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d0b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1d0c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1d0d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d0e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
1d0f0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d100 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
1d110 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d120 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1d130 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1d140 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
1d150 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
1d160 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d180 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d190 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
1d1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d1b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d1c0 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
1d1d0 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
1d1e0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1d1f0 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
1d200 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
1d210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d230 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1d240 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
1d250 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
1d260 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d270 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1d280 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d2a0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
1d2b0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
1d2c0 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
1d2d0 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
1d2e0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
1d2f0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1d300 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d310 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1d320 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
1d330 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d340 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1d350 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
1d360 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d370 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1d380 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
1d390 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d3a0 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
1d3b0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
1d3c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1d3d0 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1d3e0 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52  NE && db->nVdbeR
1d3f0 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ead>1 ){.    /* 
1d400 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
1d410 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
1d420 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
1d430 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1d440 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
1d450 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
1d460 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1d470 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
1d480 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
1d490 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
1d4a0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
1d4b0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
1d4c0 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
1d4d0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1d4e0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
1d4f0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1d500 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1d510 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
1d520 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
1d530 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
1d540 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
1d550 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
1d560 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
1d570 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
1d580 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
1d590 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
1d5a0 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
1d5b0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1d5c0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1d5d0 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
1d5e0 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
1d5f0 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
1d600 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
1d610 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
1d620 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
1d630 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1d640 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
1d650 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1d660 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
1d670 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
1d680 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
1d690 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
1d6a0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
1d6b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1d6c0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
1d6d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d6e0 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
1d6f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
1d700 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
1d710 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
1d720 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
1d730 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
1d740 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
1d750 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1d760 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
1d770 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1d780 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
1d790 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1d7a0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1d7b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
1d7c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
1d7d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
1d7e0 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
1d7f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1d800 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
1d810 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
1d820 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
1d830 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
1d840 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1d850 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
1d860 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1d870 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
1d880 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
1d890 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
1d8a0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1d8b0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
1d8c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1d8d0 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
1d8e0 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
1d8f0 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
1d900 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
1d910 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
1d920 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1d930 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
1d940 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
1d950 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
1d960 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
1d970 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
1d980 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
1d990 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
1d9a0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
1d9b0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
1d9c0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
1d9d0 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
1d9e0 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
1d9f0 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
1da00 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
1da10 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1da20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
1da30 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
1da40 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
1da50 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
1da60 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
1da70 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
1da80 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
1da90 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
1daa0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
1dab0 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
1dac0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
1dad0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1dae0 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
1daf0 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
1db00 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
1db10 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
1db20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
1db30 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
1db40 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
1db50 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
1db60 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
1db70 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
1db80 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
1db90 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
1dba0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1dbb0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
1dbc0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1dbd0 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
1dbe0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1dbf0 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
1dc00 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
1dc10 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
1dc20 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
1dc30 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
1dc40 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
1dc50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1dc60 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
1dc70 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
1dc80 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
1dc90 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
1dca0 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
1dcb0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
1dcc0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1dcd0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1dce0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1dcf0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1dd00 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1dd10 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1dd20 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1dd30 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1dd40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1dd50 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1dd60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
1dd70 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
1dd80 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1dd90 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
1dda0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
1ddb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1ddc0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1ddd0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1dde0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
1ddf0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1de00 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
1de10 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
1de20 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
1de30 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
1de40 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1de50 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
1de60 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1de70 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1de80 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1de90 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1dea0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1deb0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1dec0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ded0 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
1dee0 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
1def0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
1df00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1df10 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1df20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1df30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1df40 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
1df50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1df60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1df70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1df80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
1df90 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
1dfa0 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
1dfb0 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
1dfc0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
1dfd0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1dfe0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1dff0 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1e000 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1e010 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1e020 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1e030 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e040 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e060 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1e070 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1e080 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1e090 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1e0a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1e0b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1e0c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1e0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1e0e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1e0f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1e100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1e110 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1e120 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1e130 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1e140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1e150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e160 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1e170 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1e180 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1e190 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1e1a0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1e1b0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1e1c0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
1e1d0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1e1e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
1e1f0 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
1e200 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
1e210 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
1e220 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
1e230 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
1e240 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
1e250 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
1e260 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
1e270 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
1e280 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1e290 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
1e2a0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
1e2b0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1e2c0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1e2d0 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
1e2e0 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
1e2f0 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1e300 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e310 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1e320 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1e330 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
1e340 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
1e350 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
1e360 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
1e370 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
1e380 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
1e390 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
1e3a0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1e3b0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
1e3c0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
1e3d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
1e3e0 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
1e3f0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
1e400 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
1e410 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
1e420 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
1e430 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
1e440 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1e450 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
1e460 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
1e470 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1e480 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
1e490 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
1e4a0 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
1e4b0 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
1e4c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e4d0 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
1e4e0 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
1e4f0 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
1e500 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
1e510 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
1e520 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
1e530 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
1e540 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
1e550 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
1e560 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
1e570 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
1e580 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
1e590 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
1e5a0 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
1e5b0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
1e5c0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
1e5d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e5e0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1e5f0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
1e600 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
1e610 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
1e620 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
1e630 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
1e640 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e650 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1e660 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1e670 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
1e680 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
1e690 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
1e6a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e6b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
1e6c0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
1e6d0 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
1e6e0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
1e6f0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
1e700 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1e710 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e720 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
1e730 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
1e740 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1e750 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1e760 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
1e770 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
1e780 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
1e790 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
1e7a0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
1e7b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e7c0 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
1e7d0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
1e7e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e7f0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
1e800 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
1e810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e820 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e830 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
1e840 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1e850 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
1e860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
1e870 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1e880 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1e8b0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1e8c0 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
1e8d0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1e8e0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
1e8f0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1e900 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1e910 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1e920 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e930 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1e940 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1e950 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1e960 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1e970 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1e980 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1e990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e9a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
1e9b0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
1e9c0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1e9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
1e9e0 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
1e9f0 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
1ea00 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
1ea10 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
1ea20 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1ea30 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
1ea40 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
1ea50 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
1ea60 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
1ea70 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
1ea80 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
1ea90 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1eaa0 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
1eab0 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
1eac0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
1ead0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1eae0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1eaf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1eb00 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1eb10 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1eb20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1eb30 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1eb40 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1eb50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1eb60 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1eb70 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1eb80 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
1eb90 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
1eba0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ebb0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
1ebc0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
1ebd0 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
1ebe0 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
1ebf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1ec00 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
1ec10 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
1ec20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
1ec30 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
1ec40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ec50 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
1ec60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ec70 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
1ec80 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1ec90 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1eca0 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
1ecb0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
1ecc0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1ecd0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1ece0 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
1ecf0 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
1ed00 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1ed10 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
1ed20 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
1ed30 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1ed40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
1ed50 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
1ed60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
1ed70 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1ed80 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
1ed90 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
1eda0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1edb0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1edc0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1edd0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1ede0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1edf0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1ee00 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1ee10 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1ee20 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1ee30 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1ee40 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1ee50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1ee60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1ee70 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1ee80 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1ee90 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1eea0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1eeb0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1eec0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1eed0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1eee0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1eef0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1ef00 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1ef10 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1ef20 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1ef30 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1ef40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1ef50 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1ef60 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1ef70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1ef80 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1ef90 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1efa0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1efb0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1efc0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1efd0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1efe0 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1eff0 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1f000 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1f010 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1f020 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1f030 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f040 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
1f050 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
1f060 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
1f070 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1f080 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
1f090 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1f0a0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f0b0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1f0c0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1f0d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f0e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0f0 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1f100 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1f110 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1f120 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
1f130 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1f140 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1f150 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1f160 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1f170 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1f180 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1f190 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1f1a0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1f1b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1f1c0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1f1d0 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1f1e0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1f1f0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1f200 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1f210 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1f220 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1f230 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1f240 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1f250 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1f260 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1f270 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1f280 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1f290 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1f2a0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1f2b0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1f2c0 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1f2d0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1f2e0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1f2f0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1f300 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1f310 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1f320 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1f330 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1f340 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1f350 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1f360 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1f370 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1f380 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1f390 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1f3a0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1f3b0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1f3c0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1f3d0 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1f3e0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1f3f0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1f400 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1f410 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1f420 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1f430 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1f440 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1f450 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1f460 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1f470 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1f480 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1f490 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1f4a0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1f4b0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f4c0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1f4d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f4e0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1f4f0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1f500 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1f510 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1f520 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1f530 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f540 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1f550 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1f560 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1f570 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1f580 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1f590 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1f5a0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1f5b0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1f5c0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1f5d0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1f5e0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1f5f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1f600 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1f610 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1f620 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1f630 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1f640 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1f650 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1f660 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1f670 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1f680 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1f690 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1f6a0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1f6b0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1f6c0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1f6d0 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1f6e0 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1f6f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1f700 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1f710 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1f720 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1f730 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1f740 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1f750 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1f760 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f770 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1f780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1f790 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1f7a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1f7b0 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1f7c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f7d0 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1f7e0 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1f7f0 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1f800 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1f810 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1f820 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1f830 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1f840 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1f850 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1f860 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1f870 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1f880 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1f890 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1f8a0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1f8b0 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1f8c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1f8d0 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1f8e0 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1f8f0 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1f900 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1f910 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1f920 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1f930 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1f940 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1f950 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1f960 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1f970 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1f980 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1f990 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1f9a0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1f9b0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1f9c0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1f9d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1f9e0 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1f9f0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1fa00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1fa10 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1fa20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1fa30 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1fa40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1fa50 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1fa60 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1fa70 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1fa80 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1fa90 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1faa0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1fab0 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1fac0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1fad0 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1fae0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1faf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fb00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1fb10 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1fb20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1fb30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1fb50 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1fb60 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1fb70 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1fb80 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1fb90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1fba0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1fbb0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1fbc0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1fbd0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1fbe0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1fbf0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1fc00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1fc10 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1fc20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1fc30 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1fc40 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1fc50 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1fc60 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1fc70 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1fc80 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1fc90 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1fca0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fcc0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1fcd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1fce0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1fcf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1fd00 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1fd10 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1fd20 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1fd30 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1fd40 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1fd50 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1fd60 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1fd70 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1fd80 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1fd90 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1fda0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1fdb0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1fdc0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1fdd0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1fde0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1fdf0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1fe00 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1fe10 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1fe20 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1fe30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1fe40 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1fe50 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1fe60 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1fe70 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1fe80 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1fe90 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1fea0 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1feb0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1fec0 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1fed0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1fee0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1fef0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1ff00 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1ff10 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1ff20 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1ff30 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1ff40 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1ff50 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1ff60 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1ff70 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1ff80 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1ff90 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1ffa0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1ffb0 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1ffc0 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1ffd0 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1ffe0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1fff0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
20000 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
20010 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
20020 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
20030 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
20040 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
20050 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
20060 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
20070 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
20080 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
20090 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
200a0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
200b0 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
200c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
200d0 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
200e0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
200f0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
20100 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
20110 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
20120 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
20130 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
20140 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
20150 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
20160 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
20170 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
20180 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
20190 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
201a0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
201b0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
201c0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
201d0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
201e0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
201f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
20200 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
20210 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
20220 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
20230 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
20240 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
20250 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
20260 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
20270 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
20280 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
20290 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
202a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
202c0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
202d0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
202e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202f0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
20300 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
20310 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
20340 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
20350 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
20360 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
20370 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
20380 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
20390 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
203a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
203b0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203d0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
203e0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
203f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20400 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
20410 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
20420 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
20430 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
20440 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
20450 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
20460 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
20470 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
20480 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
20490 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
204a0 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
204b0 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
204c0 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
204d0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
204e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
204f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
20500 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
20510 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
20520 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
20530 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
20540 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
20550 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
20560 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
20570 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
20580 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20590 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
205a0 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
205b0 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
205c0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
205d0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
205e0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
205f0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
20600 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
20610 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
20620 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
20630 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
20640 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
20650 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
20660 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
20670 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20680 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
20690 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
206a0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
206b0 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
206c0 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
206d0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
206e0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
206f0 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
20700 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
20710 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72  LY;.  }.  if( wr
20720 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
20730 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
20740 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
20750 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
20760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20770 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
20780 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65  Table==1 && btre
20790 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d  ePagecount(pBt)=
207a0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
207b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20  ( wrFlag==0 );. 
207c0 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20     iTable = 0;. 
207d0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
207e0 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
207f0 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
20800 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
20810 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
20820 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c   variables and l
20830 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
20840 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
20850 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75   list.  */.  pCu
20860 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50  r->pgnoRoot = (P
20870 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43  gno)iTable;.  pC
20880 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
20890 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
208a0 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
208b0 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b  Cur->pBtree = p;
208c0 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70  .  pCur->pBt = p
208d0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72  Bt;.  assert( wr
208e0 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
208f0 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61  g==BTCF_WriteFla
20900 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  g );.  pCur->cur
20910 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a  Flags = wrFlag;.
20920 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
20930 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
20940 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
20950 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
20960 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
20970 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
20980 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
20990 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
209a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
209b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
209c0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
209d0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
209e0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20a10 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
20a20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
20a50 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
20a60 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
20a70 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
20aa0 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
20ab0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
20ac0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
20af0 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
20b00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20b10 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b30 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
20b40 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
20b50 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
20b60 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
20b70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
20b80 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
20b90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20ba0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
20bb0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
20bc0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
20bd0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
20be0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
20bf0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20c00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20c10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20c20 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
20c30 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
20c40 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
20c50 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
20c60 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
20c70 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
20c80 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
20c90 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
20ca0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
20cb0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
20cc0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
20cd0 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
20ce0 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
20cf0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
20d00 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
20d10 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
20d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20d30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20d40 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
20d50 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
20d60 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
20d70 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
20d80 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
20d90 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
20da0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
20db0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
20dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
20dd0 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
20de0 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
20df0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
20e00 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
20e10 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
20e20 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
20e30 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
20e40 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
20e50 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
20e60 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
20e70 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
20e80 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
20e90 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
20ea0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
20eb0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
20ec0 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
20ed0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
20ee0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
20ef0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
20f00 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
20f10 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
20f20 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
20f30 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
20f40 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
20f50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20f60 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
20f70 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
20f80 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
20f90 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20fa0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
20fb0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
20fc0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
20fd0 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
20fe0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
20ff0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21000 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
21010 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
21020 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
21030 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
21040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21050 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
21060 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
21070 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
21080 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
21090 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
210a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
210b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
210c0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
210d0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
210e0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
210f0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
21100 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
21110 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
21120 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
21130 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
21140 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21150 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
21160 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
21170 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
21180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21190 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
211a0 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
211b0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
211c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
211d0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
211e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
211f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21200 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
21210 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
21220 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
21230 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
21240 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
21250 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
21260 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
21270 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
21280 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
21290 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
212a0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
212b0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
212c0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
212d0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
212e0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
212f0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
21300 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
21310 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
21320 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
21330 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
21340 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
21350 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
21360 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
21370 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
21380 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
21390 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
213a0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
213b0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
213c0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
213d0 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
213e0 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
213f0 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
21400 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
21410 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
21420 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
21430 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
21440 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
21450 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
21460 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
21470 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
21480 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
21490 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
214a0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
214b0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
214c0 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
214d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
214e0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
214f0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
21500 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
21510 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
21520 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
21530 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
21540 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
21550 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
21560 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
21570 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
21580 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
21590 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
215a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
215b0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
215c0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
215d0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
215e0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
215f0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
21600 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
21610 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
21620 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
21630 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
21640 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
21650 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
21660 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
21670 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
21680 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
21690 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
216a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
216b0 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
216c0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
216d0 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
216e0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
216f0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
21700 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
21710 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
21720 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
21730 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
21740 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
21750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21760 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
21770 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
21780 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
21790 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
217a0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
217b0 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
217c0 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
217d0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
217e0 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
217f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21830 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
21840 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
21850 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
21890 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
218a0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
218e0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
218f0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
21900 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
21910 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
21920 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43          \.    pC
21930 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
21940 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20  BTCF_ValidNKey; 
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
21980 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
219d0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
219e0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
219f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
21a20 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
21a30 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
21a40 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
21a50 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
21a60 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
21a70 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
21a80 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
21a90 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
21aa0 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
21ab0 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
21ac0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
21ad0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
21ae0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
21af0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
21b00 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
21b10 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
21b20 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
21b30 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
21b40 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
21b50 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
21b60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21b70 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
21b80 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
21b90 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
21ba0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21bb0 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
21bc0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
21bd0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
21be0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21bf0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
21c00 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
21c10 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
21c20 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
21c30 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
21c40 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
21c50 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
21c60 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
21c70 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
21c80 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
21c90 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
21ca0 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
21cb0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21cc0 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
21cd0 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
21ce0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21cf0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
21d00 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
21d10 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
21d20 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
21d30 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
21d40 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
21d50 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
21d60 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
21d70 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
21d80 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
21d90 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
21da0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21db0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
21dc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21dd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21de0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21df0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21e00 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
21e10 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
21e20 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
21e30 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
21e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21e50 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
21e60 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
21e70 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
21e80 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
21e90 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
21ea0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
21eb0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
21ec0 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
21ed0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
21ee0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
21ef0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
21f00 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
21f10 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
21f20 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
21f30 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
21f40 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
21f50 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
21f60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21f70 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
21f80 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
21f90 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
21fa0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
21fb0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
21fc0 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
21fd0 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
21fe0 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
21ff0 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
22000 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
22010 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
22020 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
22030 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
22040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22050 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
22060 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
22070 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
22080 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22090 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
220a0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
220b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
220c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
220d0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
220e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
220f0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
22100 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
22110 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22120 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22130 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
22140 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
22150 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
22160 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
22170 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
22180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
22190 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
221a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
221b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
221c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
221d0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
221e0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
221f0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22200 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22210 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22220 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22230 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22240 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
22250 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
22260 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
22270 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
22280 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
22290 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
222a0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
222b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
222c0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
222d0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
222e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
222f0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22300 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22310 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22320 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22330 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22340 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
22350 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
22360 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
22370 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
22380 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
22390 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
223a0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
223b0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
223c0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
223d0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
223e0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
223f0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22400 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22410 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22420 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22430 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22440 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
22450 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
22460 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
22470 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
22480 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
22490 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
224a0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
224b0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
224c0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
224d0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
224e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
224f0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22500 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22510 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22520 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22530 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22540 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
22550 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
22560 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
22570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22590 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
225a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225b0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
225c0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
225d0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
225e0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
225f0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22600 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22610 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22620 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22640 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
22650 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
22660 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
22670 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
22680 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
22690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
226a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
226b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
226c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
226d0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
226e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
226f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22700 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
22710 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
22720 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
22730 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
22740 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
22750 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
22760 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
22770 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
22780 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
22790 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
227a0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
227b0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
227c0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
227d0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
227e0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
227f0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
22800 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
22810 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
22820 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
22830 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
22840 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
22850 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
22860 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
22870 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
22880 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
22890 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
228a0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
228b0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
228c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
228d0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
228e0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
228f0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
22900 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22910 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22920 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22930 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
22940 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
22950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22960 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
22970 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
22980 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
22990 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
229a0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
229b0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
229c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
229d0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
229e0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
229f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22a00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a10 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
22a20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22a30 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
22a40 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
22a50 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
22a60 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
22a70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a80 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
22a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
22ab0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
22ac0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
22ad0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
22ae0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
22af0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
22b00 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
22b10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22b20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
22b30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22b40 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
22b50 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
22b60 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
22b70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
22b80 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
22b90 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
22ba0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
22bb0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
22bc0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22bd0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
22be0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
22bf0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
22c00 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
22c10 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
22c20 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
22c30 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
22c40 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
22c50 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
22c60 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
22c70 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
22c80 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
22c90 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
22ca0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
22cb0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
22cc0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
22cd0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
22ce0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
22cf0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22d00 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22d10 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
22d20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
22d30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
22d40 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
22d50 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
22d60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22d70 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
22d80 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
22d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22da0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
22db0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
22dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22dd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22de0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
22df0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
22e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
22e10 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
22e20 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
22e30 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
22e40 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
22e50 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
22e60 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
22e70 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
22e80 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
22e90 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
22ea0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
22eb0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22ec0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22ed0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
22ee0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22ef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22f10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
22f20 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
22f30 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
22f40 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
22f50 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
22f60 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
22f70 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22f80 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
22f90 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
22fa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
22fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22fc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22fd0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
22fe0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
22ff0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
23000 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
23010 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
23020 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
23030 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
23040 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
23050 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
23060 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
23070 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
23080 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
23090 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
230a0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
230b0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
230c0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
230d0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
230e0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
230f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
23100 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
23110 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23120 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
23130 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
23140 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
23150 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
23160 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
23170 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
23180 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
23190 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
231a0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
231b0 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
231c0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
231d0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
231e0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
231f0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23200 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23210 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23220 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23230 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23240 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
23250 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
23260 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
23270 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
23280 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
23290 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
232a0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
232b0 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
232c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
232d0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
232e0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
232f0 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23300 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23310 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23320 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23330 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23340 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
23350 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
23360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
23370 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
23380 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
23390 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
233a0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
233b0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
233c0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
233d0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
233e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
233f0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23400 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23410 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23420 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23430 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23440 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
23450 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23460 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
23470 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
23480 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
23490 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
234a0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
234b0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
234c0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
234d0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
234e0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
234f0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23500 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23510 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23520 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23530 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23540 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
23550 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
23560 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
23570 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
23580 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
23590 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
235a0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
235b0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
235c0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
235d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
235e0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
235f0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23600 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23610 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23620 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23630 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23640 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
23650 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
23660 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
23670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23680 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
23690 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
236a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
236b0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
236c0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
236d0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
236e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
236f0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
23700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23710 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
23720 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
23730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
23740 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
23750 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
23760 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
23770 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
23780 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
23790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
237b0 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
237c0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
237d0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
237e0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
237f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23800 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23820 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23830 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
23850 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23860 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23870 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
23880 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
23890 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
238a0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
238b0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
238c0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
238d0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
238e0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
238f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23900 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23910 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
23920 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
23930 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
23940 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
23950 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
23960 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
23970 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
23980 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
23990 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
239a0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
239b0 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
239c0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
239d0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
239e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
239f0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
23a00 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
23a10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
23a30 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
23a40 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
23a50 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
23a60 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
23a70 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
23a80 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
23a90 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
23aa0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
23ab0 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
23ac0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23ad0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
23ae0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
23af0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
23b00 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
23b10 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
23b20 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
23b30 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
23b40 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
23b50 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
23b60 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
23b70 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
23b80 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
23b90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
23ba0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
23bb0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
23bc0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
23bd0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
23be0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
23bf0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
23c00 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
23c10 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
23c20 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
23c30 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
23c40 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
23c50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
23c60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
23c70 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
23c80 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
23c90 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
23ca0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
23cb0 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
23cc0 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
23cd0 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
23ce0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
23cf0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
23d00 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
23d10 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
23d20 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
23d30 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
23d40 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
23d50 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
23d60 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
23d70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
23d80 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
23d90 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
23da0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
23db0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
23dc0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
23dd0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
23de0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
23df0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
23e00 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
23e10 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
23e20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
23e30 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
23e40 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
23e50 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
23e60 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
23e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
23e80 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
23e90 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
23ea0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
23eb0 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
23ec0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
23ed0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
23ee0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
23ef0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
23f00 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
23f10 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
23f20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
23f30 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
23f40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23f50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23f70 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
23f80 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
23f90 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
23fa0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
23fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23fc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
23fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23fe0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
23ff0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
24000 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
24010 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
24020 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
24030 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
24040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
24050 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
24060 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
24070 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
24080 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
24090 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
240a0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
240b0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
240c0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
240d0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
240e0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
240f0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24100 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24110 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
24120 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
24130 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
24140 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
24150 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
24160 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
24170 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
24180 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
24190 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
241a0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
241b0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
241c0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
241d0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
241e0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
241f0 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
24200 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
24210 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
24220 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24230 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
24240 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
24250 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24260 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24270 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
24280 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
24290 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
242a0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
242b0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
242c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
242d0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
242e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
242f0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
24300 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24310 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
24320 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
24330 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
24340 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
24350 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
24360 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
24370 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
24380 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
24390 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
243a0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
243b0 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
243c0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
243d0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
243e0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
243f0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
24400 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
24410 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
24420 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
24430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24440 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
24450 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
24460 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
24470 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
24480 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
24490 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
244a0 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
244b0 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
244c0 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
244d0 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
244e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
244f0 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
24500 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
24510 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24520 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
24530 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24540 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
24550 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
24560 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
24570 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
24580 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
24590 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
245a0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
245b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
245c0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
245d0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
245e0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
245f0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24600 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
24610 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
24620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24630 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
24640 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
24650 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
24660 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
24670 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
24680 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
24690 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
246a0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
246b0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
246c0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
246d0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
246e0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
246f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
24700 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
24710 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
24720 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
24730 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
24740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
24750 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
24760 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
24770 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24780 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
24790 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
247a0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
247b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
247c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
247d0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
247e0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
247f0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
24800 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
24810 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
24820 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
24830 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
24840 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
24850 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
24860 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
24870 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24880 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
24890 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
248a0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
248b0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
248c0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
248d0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
248e0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
248f0 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
24900 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
24910 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
24920 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
24930 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
24940 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
24950 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
24960 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
24970 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
24980 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
24990 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
249a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
249b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
249c0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
249d0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
249e0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
249f0 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
24a00 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
24a10 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
24a20 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
24a30 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
24a40 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
24a50 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
24a60 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
24aa0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
24ab0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24ae0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24af0 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
24b00 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
24b30 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
24b40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
24b50 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b70 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
24b80 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
24b90 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
24ba0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
24bb0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
24bc0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
24bd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
24be0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c00 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
24c10 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
24c20 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
24c50 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
24c60 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
24c70 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
24c80 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
24c90 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
24ca0 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
24cb0 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
24ce0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
24cf0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
24d00 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
24d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24d20 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
24d30 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
24d40 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
24d50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
24d60 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24d70 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
24d80 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24d90 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
24da0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
24db0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
24dc0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
24dd0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
24de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24df0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
24e00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
24e10 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
24e20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
24e30 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
24e40 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
24e50 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
24e60 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
24e70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24e90 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
24ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
24eb0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
24ec0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
24ed0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
24ee0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
24ef0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
24f00 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
24f10 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
24f20 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
24f30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24f40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24f50 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
24f60 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
24f70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
24f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24f90 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
24fa0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
24fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24fc0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24fd0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
24fe0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24ff0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25000 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
25010 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
25020 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
25030 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
25040 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
25050 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
25060 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
25070 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
25080 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
25090 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
250a0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
250b0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
250c0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
250d0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
250e0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
250f0 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
25100 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25110 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25120 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
25130 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
25140 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
25150 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
25160 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
25170 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
25180 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
25190 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
251a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
251b0 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
251c0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
251d0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
251e0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
251f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25200 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25210 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25220 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25240 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
25250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25260 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
25280 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
25290 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
252a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
252b0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
252c0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
252d0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
252e0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
252f0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
25300 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
25310 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
25320 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
25330 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
25340 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
25350 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
25360 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
25370 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
25380 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
25390 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
253a0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
253b0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
253c0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
253d0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
253e0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
253f0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
25400 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
25410 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
25420 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
25430 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25440 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
25450 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25460 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25470 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
25480 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
25490 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
254a0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
254b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
254c0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
254d0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
254e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
254f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25510 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25520 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25530 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
25550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25560 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25570 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
25580 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25590 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
255a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
255b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
255c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
255d0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
255e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
255f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
25600 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
25610 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
25620 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
25630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25650 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
25660 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
25670 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
25680 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
25690 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
256a0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
256b0 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
256c0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
256d0 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
256e0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
256f0 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
25700 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
25710 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
25720 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
25730 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
25740 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
25750 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
25760 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
25770 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
25780 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
25790 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
257a0 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
257b0 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
257c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
257d0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
257e0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
257f0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
25800 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
25810 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
25820 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
25830 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
25840 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
25850 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
25860 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
25870 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
25880 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
25890 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
258a0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
258b0 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
258c0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
258d0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
258e0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
258f0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
25900 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
25910 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
25920 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
25930 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
25940 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
25950 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25960 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
25970 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
25980 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
25990 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
259a0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
259b0 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
259c0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
259d0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
259e0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
259f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
25a00 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25a10 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
25a20 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
25a30 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
25a40 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
25a50 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
25a60 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
25a70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
25a80 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
25a90 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25aa0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
25ab0 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
25ac0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
25ad0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
25ae0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
25af0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
25b00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25b10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25b20 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25b30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25b40 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25b50 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25b60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25b70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25b90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25ba0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
25bb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25bc0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
25bd0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25be0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
25bf0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25c00 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
25c10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25c20 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
25c30 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
25c40 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
25c50 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
25c60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25c70 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
25c80 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
25c90 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
25ca0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25cb0 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
25cc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
25cd0 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
25ce0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
25cf0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
25d00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
25d10 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
25d20 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
25d30 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
25d40 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
25d50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
25d60 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
25d70 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
25d80 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
25d90 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
25da0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
25db0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
25dc0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
25dd0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
25de0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
25df0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
25e00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
25e10 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
25e20 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
25e30 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
25e40 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
25e50 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
25e60 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
25e70 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
25e80 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
25e90 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
25ea0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
25eb0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
25ec0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
25ed0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
25ee0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
25ef0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
25f00 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
25f10 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
25f20 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
25f30 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
25f40 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
25f50 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
25f60 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
25f70 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
25f80 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
25f90 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
25fa0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
25fb0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
25fc0 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
25fd0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
25fe0 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20   pAmt);.}.const 
25ff0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
26000 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
26010 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
26020 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
26030 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
26040 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
26050 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
26060 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
26070 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
26080 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
26090 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
260a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
260b0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
260c0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
260d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
260e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
260f0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
26100 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
26110 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
26120 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
26130 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
26140 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
26150 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
26160 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
26170 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
26180 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
26190 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
261a0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
261b0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
261c0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
261d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
261e0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
261f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
26200 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
26210 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
26220 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
26230 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
26240 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26250 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26260 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26270 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26280 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
262a0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
262b0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
262c0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
262d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
262e0 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
262f0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
26300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26320 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
26330 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
26340 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
26350 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
26360 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46       (pCur->curF
26370 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
26380 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45  eFlag)==0 ? PAGE
26390 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
263a0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
263b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
263c0 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
263d0 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
263e0 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
263f0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
26400 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
26410 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
26420 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
26430 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
26440 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
26450 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  );.  if( pNewPag
26460 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e  e->nCell<1 || pN
26470 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d  ewPage->intKey!=
26480 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
26490 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
264a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
264b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
264c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
264d0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
264e0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
264f0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
26500 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
26510 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
26520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
26530 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
26540 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
26550 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
26560 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
26570 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
26580 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
26590 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
265a0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
265b0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
265c0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
265d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
265e0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
265f0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
26600 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
26610 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
26620 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
26630 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
26640 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
26650 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
26660 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
26670 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
26680 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
26690 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
266c0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
266d0 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
266e0 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
266f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
26700 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
26710 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
26720 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
26730 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
26740 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
26750 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
26760 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
26770 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
26780 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
26790 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
267a0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
267b0 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
267c0 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
267d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
267e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
267f0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
26800 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
26810 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
26820 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
26830 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
26840 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
26850 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
26860 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
26870 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
26880 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
26890 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
268a0 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
268b0 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
268c0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
268d0 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
268e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
268f0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
26900 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26910 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26920 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26940 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
26950 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
26960 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
26970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
26980 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26990 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
269a0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
269b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
269c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
269d0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
269e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
269f0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
26a00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26a10 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  ]->pgno.  );.  t
26a20 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
26a30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26a40 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
26a50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
26a60 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72  ]->nCell );..  r
26a70 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
26a80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26a90 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
26aa0 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
26ab0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
26ac0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
26ad0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
26ae0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
26af0 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  vfl);.}../*.** M
26b00 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
26b10 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
26b20 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
26b30 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
26b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
26b50 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
26b60 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
26b70 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
26b80 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
26b90 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
26ba0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
26bb0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
26bc0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
26bd0 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
26be0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
26bf0 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
26c00 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
26c10 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
26c20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
26c30 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
26c40 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
26c50 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
26c60 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
26c70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
26c80 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
26c90 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
26ca0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
26cb0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
26cc0 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
26cd0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
26ce0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
26cf0 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
26d00 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
26d10 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
26d20 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
26d30 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
26d40 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
26d50 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
26d60 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
26d70 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
26d80 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
26d90 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
26da0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
26db0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
26dc0 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
26dd0 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
26de0 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
26df0 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
26e00 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
26e10 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
26e20 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
26e30 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
26e40 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
26e50 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
26e60 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
26e70 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
26e80 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
26e90 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
26ea0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
26eb0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
26ec0 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
26ed0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
26ee0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
26ef0 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
26f00 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
26f10 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
26f20 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
26f30 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
26f40 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
26f50 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
26f60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
26f70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26f80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26f90 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26fa0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
26fb0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26fd0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
26fe0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
27000 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
27010 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
27020 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
27030 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
27040 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
27050 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
27060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
27070 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
27080 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
27090 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
270a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
270b0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
270c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
270d0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
270e0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
270f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
27100 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
27110 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65  ur->iPage ) rele
27120 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
27130 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27140 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  --]);.  }else if
27150 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27160 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
27170 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27180 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
27190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
271a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
271b0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
271c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
271d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
271e0 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
271f0 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
27200 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75         (pCur->cu
27210 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
27220 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41  iteFlag)==0 ? PA
27230 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
27240 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
27250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27260 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
27270 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
27280 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
27290 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
272a0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
272b0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
272c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
272d0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
272e0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
272f0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
27300 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
27310 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
27320 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
27330 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
27340 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
27350 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
27360 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
27370 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
27380 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
27390 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
273a0 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
273b0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
273c0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
273d0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
273e0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
273f0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
27400 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
27410 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
27420 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
27430 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
27440 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
27450 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
27460 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
27470 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27480 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
27490 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
274a0 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
274b0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
274c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
274d0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
274e0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
274f0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
27500 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
27510 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
27520 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
27530 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
27540 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
27550 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
27560 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
27570 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
27580 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
27590 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
275a0 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
275b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
275c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
275d0 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
275e0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
275f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27600 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
27610 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
27620 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
27630 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
27640 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
27650 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
27660 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
27670 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
27680 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
27690 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
276a0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
276b0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
276c0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
276d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
276e0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
276f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
27700 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
27710 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
27720 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27730 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
27740 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
27750 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
27760 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
27770 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27780 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
27790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
277a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
277b0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
277c0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
277d0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
277e0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
277f0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
27800 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
27810 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
27820 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
27830 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
27840 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
27850 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
27860 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
27870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27880 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
27890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
278a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
278b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
278c0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
278d0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
278e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
278f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27900 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27910 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27920 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
27930 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
27940 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27950 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27960 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
27970 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27980 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27990 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
279a0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
279b0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
279c0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
279d0 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
279e0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
279f0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
27a00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
27a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
27a20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
27a30 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
27a40 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
27a50 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
27a60 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
27a70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
27a80 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
27a90 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
27aa0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
27ab0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
27ac0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
27ad0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
27ae0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
27af0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
27b00 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
27b10 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
27b20 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
27b30 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
27b40 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
27b50 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
27b60 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
27b70 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
27b80 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
27b90 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
27ba0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
27bb0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
27bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
27bd0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
27be0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
27bf0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
27c00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27c20 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
27c30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27c40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27c50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27c60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27c70 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
27c80 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27c90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
27ca0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
27cb0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
27cc0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27cd0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27ce0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
27cf0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27d00 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
27d10 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
27d20 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
27d30 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
27d40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
27d50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27d60 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
27d70 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
27d80 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
27d90 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
27da0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
27db0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
27dc0 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
27dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27de0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
27df0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
27e00 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
27e10 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
27e20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
27e30 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
27e40 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
27e50 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
27e60 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
27e70 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
27e80 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
27e90 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
27ea0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
27eb0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
27ec0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
27ed0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
27ee0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27ef0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27f20 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
27f30 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
27f40 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
27f50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
27f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f70 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
27f80 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
27f90 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
27fa0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
27fb0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
27fc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27fd0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
27fe0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
27ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28000 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28010 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28020 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
28030 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28040 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
28050 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
28060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
28080 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
28090 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
280a0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
280b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
280c0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
280d0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
280e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
280f0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
28100 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
28110 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
28120 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
28130 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
28140 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
28150 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28160 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28170 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
28180 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28190 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
281a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
281b0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
281c0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
281d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
281e0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
281f0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
28200 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
28210 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
28220 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
28230 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
28240 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28250 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
28260 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
28270 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
28280 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
28290 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
282a0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
282b0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
282c0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
282d0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
282e0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
282f0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
28300 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
28310 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
28320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
28330 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
28340 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
28350 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
28360 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28370 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28380 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
28390 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
283a0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
283b0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
283c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
283d0 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
283e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
28400 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
28410 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
28420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
28430 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
28440 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
28450 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28460 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
28470 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
28480 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
28490 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
284a0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
284b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
284c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
284d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
284e0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
284f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
28500 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
28510 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
28520 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28530 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
28540 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
28550 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
28560 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
28570 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28580 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
28590 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
285a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
285b0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
285c0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
285d0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
285e0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
285f0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
28600 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
28610 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
28620 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
28630 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
28640 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
28650 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
28660 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
28670 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
28680 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
28690 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
286a0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
286b0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
286c0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
286d0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
286e0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
286f0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
28700 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
28710 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
28720 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
28730 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
28740 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
28750 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
28760 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
28770 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
28780 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
28790 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
287a0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
287b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
287c0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
287d0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
287e0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
287f0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
28800 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
28810 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
28820 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
28830 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
28840 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
28850 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
28860 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
28870 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
28880 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
28890 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
288a0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
288b0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
288c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
288d0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
288e0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
288f0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
28900 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
28910 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
28920 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
28930 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
28940 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
28950 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
28960 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
28970 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
28980 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
28990 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
289a0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
289b0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
289c0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
289d0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
289e0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
289f0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
28a00 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
28a10 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
28a20 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
28a30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28a40 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
28a50 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
28a60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
28a70 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
28a80 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
28a90 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
28aa0 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
28ab0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
28ac0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
28ad0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
28ae0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
28af0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
28b00 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
28b10 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
28b20 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
28b30 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
28b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b50 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
28b60 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
28b70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
28b80 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
28b90 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
28ba0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
28bb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
28bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
28bd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
28be0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
28bf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
28c00 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
28c10 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
28c20 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
28c30 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
28c40 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
28c50 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
28c60 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
28c70 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
28c80 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
28c90 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
28ca0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
28cb0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
28cc0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
28cd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
28ce0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
28cf0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
28d00 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
28d10 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
28d20 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
28d30 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
28d40 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
28d50 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
28d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28d80 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
28d90 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
28da0 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
28db0 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
28dc0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28dd0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
28de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28df0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
28e00 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
28e10 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
28e20 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
28e30 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
28e40 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
28e50 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
28e60 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
28e70 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
28e80 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
28e90 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
28ea0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
28eb0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
28ec0 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
28ed0 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
28ee0 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
28ef0 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
28f00 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
28f10 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
28f20 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
28f30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
28f40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
28f50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
28f60 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
28f70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
28f80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28f90 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
28fa0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28fb0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
28fc0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
28fd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28fe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
28ff0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29000 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29010 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
29020 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29030 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
29040 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
29050 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29060 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29070 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29080 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29090 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
290a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
290b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
290c0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
290d0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
290e0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
290f0 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
29100 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
29110 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
29120 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
29130 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29140 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
29150 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29170 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
29180 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
29190 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
291a0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
291b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
291c0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
291d0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
291e0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
291f0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
29200 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
29210 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
29220 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
29230 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
29240 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
29250 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
29260 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
29270 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
29280 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
29290 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
292a0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
292b0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
292c0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
292d0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
292e0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
292f0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
29300 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
29310 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
29320 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
29330 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
29340 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
29350 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
29360 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
29370 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
29380 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
29390 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
293a0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
293b0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
293c0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
293d0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
293e0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
293f0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
29400 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
29410 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
29420 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
29430 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29440 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
29450 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
29460 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
29470 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
29480 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
29490 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
294a0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
294b0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
294c0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
294d0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
294e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
294f0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
29500 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
29510 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
29520 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
29530 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
29540 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
29550 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29560 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
29570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29580 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
29590 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
295a0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
295b0 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
295c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
295d0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
295e0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
295f0 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
29600 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
29610 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
29620 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
29630 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
29640 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
29650 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
29660 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
29670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29680 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
29690 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
296a0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
296b0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
296c0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
296d0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
296e0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
296f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
29700 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29710 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
29720 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
29730 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
29740 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
29750 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
29760 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
29770 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
29780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29790 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
297a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
297b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
297c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
297d0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
297e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
297f0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
29800 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
29810 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
29820 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
29830 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
29840 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
29850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29860 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
29870 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
29880 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
29890 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
298a0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
298b0 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  PtrSize;..      
298c0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
298d0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
298e0 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
298f0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
29900 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
29910 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
29920 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
29930 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
29940 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
29950 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
29960 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
29970 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
29980 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
29990 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
299a0 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
299b0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
299c0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
299d0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
299e0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
299f0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
29a00 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
29a10 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
29a20 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
29a30 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
29a40 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
29a50 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
29a60 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
29a70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
29a80 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
29a90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29aa0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
29ab0 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
29ac0 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
29ad0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
29ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
29af0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
29b00 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
29b10 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
29b20 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
29b30 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
29b40 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
29b50 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
29b60 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
29b70 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
29b80 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
29b90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
29ba0 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
29bb0 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
29bc0 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
29bd0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
29be0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
29bf0 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
29c00 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
29c10 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
29c20 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
29c30 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
29c40 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
29c50 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
29c60 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
29c70 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
29c80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29c90 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
29ca0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
29cb0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
29cc0 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
29cd0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
29ce0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
29cf0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
29d00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
29d10 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
29d20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
29d30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
29d40 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
29d50 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
29d60 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
29d70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
29d80 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
29d90 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
29da0 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
29db0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
29dc0 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
29dd0 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
29de0 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
29df0 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
29e00 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
29e10 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
29e20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
29e30 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
29e40 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
29e50 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
29e60 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
29e70 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
29e80 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
29e90 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
29ea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29eb0 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
29ec0 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
29ed0 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
29ee0 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
29ef0 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
29f00 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
29f10 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
29f20 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
29f30 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
29f40 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
29f50 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
29f60 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
29f70 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
29f80 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
29f90 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
29fa0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
29fb0 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
29fc0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
29fd0 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
29fe0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
29ff0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2a000 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
2a010 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2a020 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2a030 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2a040 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2a050 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2a060 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2a070 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2a080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
2a090 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20  Cell<2 ){.      
2a0a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a0b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2a0d0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2a0e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a0f0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
2a100 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
2a110 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20  nCell+18 );.    
2a120 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
2a130 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
2a140 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a150 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2a160 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2a170 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2a180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2a190 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a1a0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2a1b0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2a1c0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2a1d0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2a1e0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2a1f0 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
2a200 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2a210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2a220 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2a230 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2a240 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2a250 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2a260 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
2a270 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2a280 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
2a290 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2a2a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a2b0 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2a2c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2a2d0 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20  sert( .         
2a2e0 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72     (pIdxKey->err
2a2f0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52  Code!=SQLITE_COR
2a300 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20  RUPT || c==0).  
2a310 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b         && (pIdxK
2a320 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2a330 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75  ITE_NOMEM || pCu
2a340 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2a350 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20  allocFailed).   
2a360 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2a370 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
2a380 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2a390 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2a3a0 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
2a3b0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2a3c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2a3d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a3e0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
2a3f0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2a400 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2a420 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a430 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2a440 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2a450 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
2a460 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53  errCode ) rc = S
2a470 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2a480 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2a490 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2a4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2a4b0 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2a4c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2a4d0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2a4e0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2a4f0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2a500 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2a510 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2a520 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2a530 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2a540 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2a550 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2a560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2a570 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2a580 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2a590 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2a5a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2a5b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<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 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
2a5e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
2a5f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a600 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2a610 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2a620 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2a630 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2a640 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2a650 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2a660 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2a670 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2a680 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2a690 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a6a0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2a6b0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2a6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6d0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2a6e0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2a6f0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2a700 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2a710 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2a720 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2a730 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2a740 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2a750 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2a760 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2a770 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2a780 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2a790 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a7a0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2a7b0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2a7c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a7d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2a7e0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2a7f0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2a800 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2a810 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2a820 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2a830 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2a840 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2a850 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2a860 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2a870 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2a880 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2a890 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2a8a0 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2a8b0 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2a8c0 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2a8d0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2a8e0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2a8f0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2a900 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2a910 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2a920 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2a930 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2a940 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2a950 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2a960 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2a970 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2a980 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2a990 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2a9a0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2a9b0 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2a9c0 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2a9d0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2a9e0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2a9f0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2aa00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
2aa10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2aa20 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e  he next entry in
2aa30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2aa40 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2aa50 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2aa60 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2aa70 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2aa80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2aa90 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
2aaa0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
2aab0 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
2aac0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
2aad0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
2aae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2aaf0 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2ab00 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2ab10 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2ab20 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2ab30 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2ab40 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69  case of merely i
2ab50 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2ab60 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2ab70 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2ab80 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20  o the next cell 
2ab90 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
2aba0 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65  age.  The (slowe
2abb0 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68  r) btreeNext() h
2abc0 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65  elper.** routine
2abd0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
2abe0 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
2abf0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
2ac00 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a  ferent page or.*
2ac10 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  * to restore the
2ac20 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   cursor..**.** T
2ac30 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2ac40 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52  ion will set *pR
2ac50 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54  es to 0 or 1.  T
2ac60 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  he initial *pRes
2ac70 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
2ac80 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f  e 1 if the curso
2ac90 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20  r being stepped 
2aca0 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
2acb0 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a  n SQL index and.
2acc0 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  ** if this routi
2acd0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2ace0 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  en skipped if th
2acf0 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64  at SQL index had
2ad00 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75   been.** a uniqu
2ad10 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77  e index.  Otherw
2ad20 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77  ise the caller w
2ad30 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52  ill have set *pR
2ad40 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a  es to zero..** Z
2ad50 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  ero is the commo
2ad60 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65  n case. The btre
2ad70 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2ad80 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20   is free to use 
2ad90 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a  the.** initial *
2ada0 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20  pRes value as a 
2adb0 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20  hint to improve 
2adc0 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74  performance, but
2add0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2ade0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
2adf0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2ae00 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74   not. (Note that
2ae10 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65   the comdb2 btre
2ae20 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
2ae30 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69  ion does use thi
2ae40 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e  s hint, however.
2ae50 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ).*/.static SQLI
2ae60 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
2ae70 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  btreeNext(BtCurs
2ae80 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2ae90 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
2aea0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
2aeb0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2aec0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2aed0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2aee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aef0 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2af00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2af10 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2af20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2af30 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2af40 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2af50 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2af60 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2af70 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2af80 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2af90 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2afa0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2afb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2afc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2afd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2afe0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2aff0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2b000 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2b010 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2b020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b030 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2b040 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b050 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b060 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b070 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2b080 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2b090 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2b0a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2b0b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2b0c0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2b0d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2b0e0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2b0f0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2b100 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2b110 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2b120 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2b130 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2b140 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2b150 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b160 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2b170 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2b180 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2b190 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2b1a0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2b1b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2b1c0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2b1d0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2b1e0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2b1f0 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2b200 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2b210 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2b220 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2b230 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2b240 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2b250 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2b260 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2b270 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2b280 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2b290 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2b2a0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2b2b0 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2b2c0 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2b2d0 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2b2e0 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2b2f0 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2b300 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2b310 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2b320 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2b330 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2b340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2b350 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2b360 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2b370 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2b380 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2b390 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2b3a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2b3b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2b3c0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2b3d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2b3e0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2b3f0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2b400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2b410 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2b420 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b430 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b440 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b450 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2b460 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2b470 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2b480 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2b490 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b4a0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2b4b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2b4c0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2b4d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2b4e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2b4f0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2b500 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2b510 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2b520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b540 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2b550 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2b560 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2b570 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2b580 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2b590 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2b5a0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2b5b0 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2b5c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2b5d0 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2b5e0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2b5f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2b600 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2b610 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2b620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2b630 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2b640 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2b650 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2b660 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2b670 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2b680 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2b690 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
2b6a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2b6b0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2b6c0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2b6d0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2b6e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2b6f0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2b700 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2b710 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2b720 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2b730 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2b740 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  e];.  if( (++pCu
2b750 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b760 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e  Page])>=pPage->n
2b770 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2b780 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b790 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75  age]--;.    retu
2b7a0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2b7b0 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2b7c0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2b7d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b7e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b7f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2b800 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2b810 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2b820 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2b830 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2b840 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2b850 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2b860 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
2b870 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
2b880 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
2b890 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
2b8a0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
2b8b0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2b8c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2b8d0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2b8e0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2b8f0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2b900 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2b910 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2b920 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2b930 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61  Previous().  Tha
2b940 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2b950 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2b960 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2b970 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e   merely decremen
2b980 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2b990 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2b9a0 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70  iIdx.** to the p
2b9b0 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20  revious cell on 
2b9c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2b9d0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2b9e0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a  btreePrevious().
2b9f0 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  ** helper routin
2ba00 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2ba10 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2ba20 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2ba30 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  fferent page.** 
2ba40 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  or to restore th
2ba50 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2ba60 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2ba70 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2ba80 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2ba90 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2baa0 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2bab0 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2bac0 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2bad0 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2bae0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2baf0 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2bb00 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2bb10 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2bb20 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2bb30 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2bb40 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2bb50 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2bb60 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2bb70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2bb80 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2bb90 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2bba0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2bbb0 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2bbc0 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2bbd0 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2bbe0 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2bbf0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2bc00 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2bc10 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2bc20 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2bc30 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2bc40 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2bc50 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2bc60 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2bc70 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2bc80 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2bc90 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2bca0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2bcb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2bcc0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2bcd0 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2bce0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2bcf0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2bd00 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2bd10 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2bd20 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2bd30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2bd40 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2bd50 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2bd60 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2bd70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
2bd80 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2bd90 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2bda0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2bdb0 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20  _ValidNKey))==0 
2bdc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2bdd0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2bde0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2bdf0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2be00 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
2be10 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2be20 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2be30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2be40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2be50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2be60 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2be70 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2be80 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2be90 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2bea0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2beb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2bec0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2bed0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2bee0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2bef0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2bf00 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2bf10 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2bf20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bf30 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2bf40 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2bf50 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2bf60 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2bf70 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2bf80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bf90 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2bfa0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2bfb0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2bfc0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2bfd0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2bfe0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2bff0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2c000 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2c010 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
2c020 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2c030 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2c040 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c050 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2c060 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2c070 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
2c080 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2c090 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2c0a0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2c0b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
2c0c0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
2c0d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2c0e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
2c0f0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2c100 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2c110 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2c120 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2c130 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2c140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c150 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2c160 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2c170 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2c180 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c190 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2c1a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2c1b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2c1c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2c1d0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d  CF_ValidOvfl))==
2c1e0 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  0 );..    pCur->
2c1f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c200 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
2c210 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2c220 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2c230 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2c240 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
2c250 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2c260 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c270 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
2c280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c2a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2c2b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
2c2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c2d0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2c2e0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2c2f0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
2c300 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2c310 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2c320 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2c330 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2c340 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2c350 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2c360 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2c370 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2c380 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65  _VALID );.  *pRe
2c390 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  s = 0;.  pCur->c
2c3a0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2c3b0 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2c3c0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2c3d0 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  idNKey);.  pCur-
2c3e0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c3f0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2c400 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2c410 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69  D.   || pCur->ai
2c420 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c430 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  ==0.   || pCur->
2c440 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c450 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  ge]->leaf==0.  )
2c460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
2c470 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2c480 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43   pRes);.  }.  pC
2c490 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c4a0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75  iPage]--;.  retu
2c4b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c4c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2c4d0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
2c4e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c4f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
2c500 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
2c510 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
2c520 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
2c530 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
2c540 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
2c550 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
2c560 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
2c570 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
2c580 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
2c590 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
2c5a0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
2c5b0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2c5c0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
2c5d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
2c5e0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2c5f0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
2c600 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2c610 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
2c620 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
2c630 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
2c640 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
2c650 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
2c660 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
2c670 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2c680 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
2c690 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
2c6a0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
2c6b0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
2c6c0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
2c6d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2c6e0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
2c6f0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
2c700 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20   not 0, then an 
2c710 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
2c720 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
2c730 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
2c740 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
2c750 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
2c760 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
2c770 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
2c780 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
2c790 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
2c7a0 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
2c7b0 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
2c7c0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
2c7d0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
2c7e0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
2c7f0 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70  * If the eMode p
2c800 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c  arameter is BTAL
2c810 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68  LOC_EXACT and th
2c820 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78  e nearby page ex
2c830 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65  ists.** anywhere
2c840 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2c850 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
2c860 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72  aranteed to be r
2c870 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20  eturned.  If.** 
2c880 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2c890 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67  _LT then the pag
2c8a0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
2c8b0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
2c8c0 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72  equal.** to near
2c8d0 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70  by if any such p
2c8e0 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20  age exists.  If 
2c8f0 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43  eMode is BTALLOC
2c900 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a  _ANY then there.
2c910 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69  ** are no restri
2c920 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20  ctions on which 
2c930 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64  page is returned
2c940 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c950 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
2c960 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
2c970 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
2c980 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
2c990 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
2c9a0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
2c9b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
2c9c0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
2c9d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
2c9e0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
2c9f0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
2ca00 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
2ca10 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
2ca20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2ca30 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
2ca40 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
2ca50 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
2ca60 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
2ca70 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
2ca80 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
2ca90 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  NY */.){.  MemPa
2caa0 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
2cab0 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
2cac0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cad0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2cae0 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
2caf0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2cb00 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
2cb10 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
2cb20 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
2cb30 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2cb40 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
2cb50 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
2cb60 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
2cb70 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
2cb80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cb90 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2cba0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2cbb0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2cbc0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  ;.  assert( eMod
2cbd0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c  e==BTALLOC_ANY |
2cbe0 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49  | (nearby>0 && I
2cbf0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
2cc00 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a  autoVacuum)) );.
2cc10 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
2cc20 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
2cc30 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
2cc40 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49  t(pBt);.  /* EVI
2cc50 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31  DENCE-OF: R-0511
2cc60 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79  9-02637 The 4-by
2cc70 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2cc80 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
2cc90 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73  36.  ** stores s
2cca0 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20  tores the total 
2ccb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2ccc0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2ccd0 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79   */.  n = get4by
2cce0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2ccf0 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61  a[36]);.  testca
2cd00 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20  se( n==mxPage-1 
2cd10 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61  );.  if( n>=mxPa
2cd20 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2cd30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2cd40 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
2cd50 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
2cd60 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
2cd70 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
2cd80 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
2cd90 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
2cda0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
2cdb0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
2cdc0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
2cdd0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
2cde0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
2cdf0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
2ce00 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d     /* If eMode==
2ce10 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2ce20 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
2ce30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2ce40 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
2ce50 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2ce60 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
2ce70 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
2ce80 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
2ce90 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
2cea0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2ceb0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
2cec0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2ced0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2cee0 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d  M.    if( eMode=
2cef0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29  =BTALLOC_EXACT )
2cf00 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72  {.      if( near
2cf10 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
2cf20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2cf30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2cf40 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
2cf50 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2cf60 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
2cf70 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2cf80 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
2cf90 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
2cfa0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
2cfb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2cfc0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
2cfd0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
2cfe0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2cff0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
2d000 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d010 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65   }else if( eMode
2d020 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2d030 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2d040 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
2d050 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  if..    /* Decre
2d060 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69  ment the free-li
2d070 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53  st count by 1. S
2d080 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65  et iTrunk to the
2d090 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20   index of the.  
2d0a0 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d    ** first free-
2d0b0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2d0c0 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69   iPrevTrunk is i
2d0d0 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20  nitially 1..    
2d0e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2d0f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2d100 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
2d110 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2d120 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34  urn rc;.    put4
2d130 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d140 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a  ata[36], n-1);..
2d150 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20      /* The code 
2d160 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  within this loop
2d170 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63   is run only onc
2d180 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68  e if the 'search
2d190 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20  List' variable. 
2d1a0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75     ** is not tru
2d1b0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2d1c0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
2d1d0 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f  ach trunk-page o
2d1e0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65  n the.    ** fre
2d1f0 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65  e-list until the
2d200 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
2d210 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65  s located (eMode
2d220 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  ==BTALLOC_EXACT)
2d230 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c  .    ** or until
2d240 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61   a page less tha
2d250 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  n 'nearby' is lo
2d260 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54  cated (eMode==BT
2d270 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f  ALLOC_LT).    */
2d280 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
2d290 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
2d2a0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
2d2b0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2d2c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2d2d0 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30  -OF: R-01506-110
2d2e0 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  53 The first int
2d2f0 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
2d300 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
2d310 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
2d320 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2d330 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74  he next freelist
2d340 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2d350 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20  he list or.     
2d360 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68     ** zero if th
2d370 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66  is is the last f
2d380 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2d390 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ge. */.        i
2d3a0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2d3b0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2d3c0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
2d3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2d3e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2d3f0 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20  59841-13798 The 
2d400 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2d410 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2d420 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a  set 32.        *
2d430 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67  * stores the pag
2d440 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2d450 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
2d460 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a  e freelist, or z
2d470 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a  ero if.        *
2d480 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  * the freelist i
2d490 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  s empty. */.    
2d4a0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2d4b0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2d4c0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
2d4d0 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
2d4e0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
2d4f0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
2d500 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
2d510 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2d520 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d530 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2d540 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2d550 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
2d560 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2d570 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2d580 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2d590 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2d5a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2d5b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2d5c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2d5d0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2d5e0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2d5f0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2d600 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
2d610 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2d620 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
2d630 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
2d640 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2d650 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2d660 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
2d670 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
2d680 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
2d690 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
2d6a0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2d6b0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2d6c0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
2d6d0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
2d6e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2d6f0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
2d700 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
2d710 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
2d720 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
2d730 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
2d740 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
2d750 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
2d760 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
2d770 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2d780 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
2d790 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
2d7a0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
2d7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d7c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2d7d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2d7e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2d7f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2d800 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2d810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2d820 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2d830 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2d840 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2d850 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2d860 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2d870 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2d880 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
2d890 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2d8a0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2d8b0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2d8c0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2d8d0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2d8e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2d8f0 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
2d900 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2d910 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2d920 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
2d930 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
2d940 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2d950 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2d960 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d970 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
2d980 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d990 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
2d9a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d9b0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
2d9c0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
2d9d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2d9e0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
2d9f0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
2da00 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2da10 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2da20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2da30 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
2da40 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
2da50 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
2da60 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2da70 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
2da80 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2da90 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
2daa0 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
2dab0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2dac0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2dad0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2dae0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
2daf0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2db00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2db10 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2db20 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2db30 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2db40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2db50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2db60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2db70 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
2db80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2db90 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2dba0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2dbb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2dbc0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2dbd0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2dbe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dbf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2dc00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2dc10 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2dc20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2dc30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2dc40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2dc50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2dc60 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2dc70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dc80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
2dc90 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2dca0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2dcb0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2dcc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2dcd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2dce0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
2dcf0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
2dd00 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
2dd10 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
2dd20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
2dd30 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
2dd40 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
2dd50 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
2dd60 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
2dd70 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
2dd80 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
2dd90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
2dda0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
2ddc0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
2ddd0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2dde0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
2ddf0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
2de00 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
2de10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2de20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2de30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2de40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2de50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2de60 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
2de70 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
2de80 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2de90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2dea0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2deb0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2dec0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2ded0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2dee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2def0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2df00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2df10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2df20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2df30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2df40 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2df50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2df60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2df70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2df80 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2df90 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2dfa0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2dfb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2dfc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2dfd0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2dfe0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2dff0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2e000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2e010 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2e020 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2e030 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2e040 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2e050 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2e060 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2e070 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2e080 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2e090 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2e0a0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2e0b0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2e0c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e0d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2e0e0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2e0f0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2e100 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2e110 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2e120 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2e130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e140 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2e150 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e160 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2e170 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e180 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e190 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2e1a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2e1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e1c0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2e1d0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2e1e0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2e1f0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2e200 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e210 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2e220 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2e230 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2e240 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2e250 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2e260 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2e270 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2e280 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2e290 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2e2a0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2e2b0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2e2c0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2e2d0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2e2e0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2e2f0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2e300 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2e310 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2e320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2e330 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2e340 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2e350 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2e360 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2e380 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2e3a0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2e3b0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e3d0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2e3e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e3f0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2e410 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2e420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2e440 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2e450 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2e460 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2e470 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2e480 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2e490 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2e4a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2e4b0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2e4c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2e4d0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2e4e0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2e4f0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2e500 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2e510 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2e520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e530 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2e540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e550 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2e560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e580 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2e590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2e5a0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2e5b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2e5c0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2e5d0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2e5e0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2e5f0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2e600 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2e610 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2e620 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2e630 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2e640 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2e650 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2e660 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2e670 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2e680 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2e690 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2e6a0 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2e6b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2e6c0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2e6d0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2e6e0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2e6f0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2e700 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2e710 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2e720 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2e730 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2e740 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2e750 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2e760 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2e770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e780 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2e790 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2e7b0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2e7c0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2e7d0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2e7e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e7f0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2e800 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2e810 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2e820 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2e830 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2e840 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2e850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2e860 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2e870 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2e880 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2e890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e8a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2e8b0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2e8c0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2e8d0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2e8e0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2e8f0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
2e900 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
2e910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2e920 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2e930 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2e940 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
2e950 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e970 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2e980 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2e990 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
2e9a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2e9b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2e9c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e9d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e9e0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2e9f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ea00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ea10 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2ea20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ea30 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
2ea40 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
2ea50 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
2ea60 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
2ea70 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
2ea80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2ea90 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
2eaa0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2eab0 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
2eac0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2ead0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2eae0 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
2eaf0 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
2eb00 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
2eb10 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
2eb20 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
2eb30 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
2eb40 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
2eb50 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
2eb60 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
2eb70 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
2eb80 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2eb90 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
2eba0 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
2ebb0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
2ebc0 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
2ebd0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
2ebe0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2ebf0 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
2ec00 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
2ec10 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
2ec20 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
2ec30 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
2ec40 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
2ec50 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
2ec60 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
2ec70 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
2ec80 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
2ec90 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
2eca0 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
2ecb0 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
2ecc0 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
2ecd0 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
2ece0 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
2ecf0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
2ed00 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
2ed10 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
2ed20 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
2ed30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2ed40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2ed50 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
2ed60 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
2ed70 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
2ed80 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
2ed90 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
2eda0 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
2edb0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2edc0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2edd0 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
2ede0 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
2edf0 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
2ee00 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
2ee10 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
2ee20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
2ee30 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
2ee40 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
2ee50 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
2ee60 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2ee70 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
2ee80 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2ee90 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2eea0 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
2eeb0 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
2eec0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
2eed0 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
2eee0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
2eef0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ef00 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
2ef10 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
2ef20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2ef30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
2ef40 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2ef50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2ef60 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2ef70 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
2ef80 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
2ef90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2efa0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2efb0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2efc0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
2efd0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2efe0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
2eff0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
2f000 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
2f010 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
2f020 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
2f030 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
2f040 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
2f050 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
2f060 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
2f070 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2f080 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
2f090 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
2f0a0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
2f0b0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
2f0c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f0d0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
2f0e0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2f0f0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
2f100 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
2f110 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
2f120 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
2f130 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f140 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
2f150 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2f160 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
2f170 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2f180 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
2f190 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
2f1a0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
2f1b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f1c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2f1d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f1e0 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
2f1f0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2f200 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
2f210 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f220 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f230 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2f240 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
2f250 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2f260 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2f270 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
2f280 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
2f290 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
2f2a0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
2f2b0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
2f2c0 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
2f2d0 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
2f2e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
2f2f0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2f300 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
2f310 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2f320 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2f330 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2f340 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2f350 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f360 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2f370 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f380 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2f390 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2f3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f3b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2f3c0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2f3d0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
2f3e0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
2f3f0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2f400 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
2f410 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
2f420 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2f430 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2f440 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
2f450 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
2f460 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2f470 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
2f480 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2f490 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
2f4a0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
2f4b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2f4c0 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2f4d0 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
2f4e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2f4f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
2f500 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
2f510 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2f520 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2f530 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2f540 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2f550 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2f560 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2f570 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2f580 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2f590 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2f5a0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2f5b0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2f5c0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2f5d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2f5e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2f5f0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2f600 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2f610 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2f620 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2f630 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2f640 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2f650 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2f660 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2f670 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2f680 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2f690 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2f6a0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2f6b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2f6c0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2f6d0 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2f6e0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2f6f0 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2f700 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2f710 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2f720 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2f730 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2f740 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2f750 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2f760 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2f770 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2f780 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7a0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2f7b0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2f7c0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2f7f0 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2f800 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2f810 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2f820 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2f830 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2f840 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2f850 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2f860 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f870 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2f880 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2f890 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2f8a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2f8d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2f8e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2f900 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2f910 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2f920 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2f930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2f940 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2f950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
2f960 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
2f970 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
2f980 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
2f990 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
2f9a0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
2f9b0 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
2f9c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f9d0 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
2f9e0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
2f9f0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
2fa00 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
2fa10 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2fa20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2fa30 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
2fa40 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
2fa50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
2fa60 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
2fa70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
2fa80 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
2fa90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2faa0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2fab0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2fac0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2fad0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
2fae0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2faf0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
2fb00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2fb10 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
2fb20 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
2fb30 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2fb40 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
2fb50 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
2fb60 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
2fb70 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2fb80 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
2fb90 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
2fba0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
2fbb0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
2fbc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
2fbd0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
2fbe0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2fbf0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2fc00 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
2fc10 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
2fc20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fc30 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2fc40 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
2fc50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2fc60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2fc70 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
2fc80 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
2fc90 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
2fca0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
2fcb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2fcc0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2fcd0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
2fce0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
2fcf0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
2fd00 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
2fd10 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
2fd20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
2fd30 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
2fd40 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
2fd50 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
2fd60 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
2fd70 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2fd80 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2fd90 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
2fda0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
2fdb0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
2fdc0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
2fdd0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
2fde0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
2fdf0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
2fe00 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
2fe10 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
2fe20 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
2fe30 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2fe40 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
2fe50 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2fe60 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
2fe70 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
2fe80 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
2fe90 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
2fea0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
2feb0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
2fec0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2fed0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
2fee0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
2fef0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
2ff00 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
2ff10 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
2ff20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
2ff30 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
2ff40 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
2ff50 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
2ff60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2ff70 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2ff80 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
2ff90 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
2ffa0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2ffb0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2ffc0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
2ffd0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ffe0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2fff0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
30000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30010 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
30020 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
30030 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
30040 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
30050 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
30060 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
30070 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
30080 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
30090 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
300a0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
300b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
300c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
300d0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
300e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
300f0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
30100 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
30110 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
30120 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
30130 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
30140 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
30150 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
30160 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
30170 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
30180 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
30190 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
301a0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
301b0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
301c0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
301d0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
301e0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
301f0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
30200 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
30210 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
30220 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
30230 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
30240 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
30250 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
30260 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
30270 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
30280 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
30290 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
302a0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
302b0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
302c0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
302d0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
302e0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
302f0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
30300 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
30310 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
30320 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
30330 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30340 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
30350 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
30360 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
30370 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
30380 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
30390 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
303a0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
303b0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
303c0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
303d0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
303e0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
303f0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
30400 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
30410 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
30420 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
30430 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
30440 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
30450 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
30460 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
30470 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
30480 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
30490 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
304a0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
304b0 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
304c0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
304d0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
304e0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
304f0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30500 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
30510 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
30520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
30530 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
30540 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
30550 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
30560 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
30570 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
30580 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
30590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
305a0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
305b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
305c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
305d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
305e0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
305f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
30600 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
30610 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
30620 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
30630 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
30640 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
30650 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
30660 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
30670 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
30680 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30690 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
306a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
306b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
306c0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
306d0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
306e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
306f0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
30700 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
30710 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
30720 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
30730 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
30740 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
30750 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
30760 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
30770 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
30780 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
30790 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
307a0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
307b0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
307c0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
307d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
307e0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
307f0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
30800 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
30810 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
30820 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
30830 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
30840 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
30850 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
30860 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
30870 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
30880 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
30890 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
308a0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
308b0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
308c0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
308d0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
308e0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
308f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
30900 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
30910 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
30920 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
30930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30940 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
30950 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
30960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30970 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
30980 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
30990 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
309a0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
309b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
309c0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
309d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
309e0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
309f0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
30a00 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
30a10 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
30a20 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
30a30 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
30a40 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
30a50 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
30a60 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
30a70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
30a80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30a90 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
30aa0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
30ab0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
30ac0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
30ad0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
30ae0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
30af0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
30b00 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
30b10 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
30b20 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
30b30 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
30b40 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
30b50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
30b60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
30b70 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
30b80 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
30b90 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
30ba0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
30bb0 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
30bc0 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
30bd0 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
30be0 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
30bf0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
30c00 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
30c10 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
30c20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
30c30 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
30c40 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
30c50 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
30c60 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
30c70 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
30c80 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
30c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
30ca0 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
30cb0 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
30cc0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
30cd0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
30ce0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
30cf0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
30d00 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
30d10 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
30d20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
30d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
30d50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
30d60 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
30d70 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
30d80 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
30d90 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
30da0 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
30db0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
30dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30dd0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
30de0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
30df0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
30e00 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
30e10 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
30e20 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
30e30 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
30e40 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
30e50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30e60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
30e70 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
30e80 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
30e90 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
30ea0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
30eb0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
30ec0 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
30ed0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
30ee0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
30ef0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
30f00 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
30f10 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
30f20 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
30f30 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
30f40 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
30f50 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
30f60 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
30f70 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
30f80 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
30f90 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
30fa0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
30fb0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
30fc0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
30fd0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
30fe0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
30ff0 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
31000 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
31010 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
31020 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
31030 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
31040 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
31050 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
31060 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
31070 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
31080 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
31090 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
310a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
310b0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
310c0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
310d0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
310e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
310f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31100 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
31110 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
31120 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
31130 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
31140 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
31150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
31160 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
31170 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
31180 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
31190 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
311a0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
311b0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
311c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
311d0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
311e0 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
311f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
31200 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
31210 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
31220 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
31230 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
31240 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
31250 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
31260 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
31270 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
31280 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
31290 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
312a0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
312b0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
312c0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
312d0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
312e0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
312f0 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
31300 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
31310 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
31320 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
31330 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
31340 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
31350 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
31360 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
31370 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
31380 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
31390 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
313a0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
313b0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
313c0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
313d0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
313e0 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
313f0 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
31400 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
31410 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
31420 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
31430 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
31440 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
31450 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
31460 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
31470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31480 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
314a0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
314b0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
314c0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
314d0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
314e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
314f0 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
31500 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
31510 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31520 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
31530 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
31540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
31560 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
31570 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
31580 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
31590 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
315a0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
315b0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
315c0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
315d0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
315e0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
315f0 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
31600 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
31610 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
31620 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
31630 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
31640 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
31650 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
31660 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
31670 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
31680 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
31690 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
316a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
316b0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
316c0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
316d0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
316e0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
316f0 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
31700 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
31710 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
31720 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
31730 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
31740 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
31750 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
31760 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
31770 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31790 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
317a0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
317b0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
317c0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
317d0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
317e0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
317f0 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
31800 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
31810 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
31820 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
31830 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
31840 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
31850 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
31860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31870 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
31880 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
31890 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
318a0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
318d0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
318e0 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
318f0 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
31900 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
31910 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
31920 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
31930 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
31940 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
31950 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
31960 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
31970 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31980 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
31990 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
319a0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
319b0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
319c0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
319d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
319e0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
319f0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31a00 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
31a10 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
31a20 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
31a30 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
31a40 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
31a50 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
31a60 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
31a70 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
31a80 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
31a90 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
31aa0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
31ab0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
31ac0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
31ad0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
31ae0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
31af0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
31b00 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
31b10 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
31b20 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
31b30 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
31b40 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
31b50 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
31b60 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
31b70 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
31b80 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
31b90 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
31ba0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
31bb0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31bc0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
31bd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31be0 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
31bf0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
31c00 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
31c10 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
31c20 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
31c30 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
31c40 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
31c50 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
31c60 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
31c70 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
31c80 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
31c90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
31ca0 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
31cb0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
31cc0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
31cd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31ce0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31cf0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
31d00 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
31d10 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
31d20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
31d30 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Key;.  }.  if( n
31d40 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
31d50 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
31d60 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
31d70 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
31d80 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
31d90 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
31da0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
31db0 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
31dc0 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70  Size = n;.    sp
31dd0 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f  aceLeft = nPaylo
31de0 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d  ad;.    pPrior =
31df0 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b   pCell;.  }else{
31e00 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50  .    int mn = pP
31e10 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
31e20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61     n = mn + (nPa
31e30 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70  yload - mn) % (p
31e40 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
31e50 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
31e60 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
31e70 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
31e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
31e90 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
31ea0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20  +1 );.    if( n 
31eb0 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
31ec0 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20  l ) n = mn;.    
31ed0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
31ee0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b     *pnSize = n +
31ef0 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
31f00 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
31f10 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20  l[nHeader+n];.  
31f20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  }.  pPayload = &
31f30 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
31f40 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
31f50 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
31f60 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
31f70 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
31f80 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
31f90 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
31fa0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
31fb0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
31fc0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
31fd0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
31fe0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
31ff0 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
32000 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
32010 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
32020 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
32030 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
32040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32050 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
32060 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
32070 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
32080 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
32090 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
320a0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
320b0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
320c0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
320d0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
320f0 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
32100 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
32110 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
32120 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
32130 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
32140 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
32150 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
32160 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
32170 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
32180 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
32190 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
321a0 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
321b0 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65   info;.    btree
321c0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
321d0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
321e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
321f0 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66  Header=(int)(inf
32200 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65  o.pPayload - pCe
32210 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ll) );.    asser
32220 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
32230 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
32240 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
32250 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
32260 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
32270 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
32280 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
32290 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b  Prior == &pCell[
322a0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20  info.iOverflow] 
322b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
322c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
322d0 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
322e0 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
322f0 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
32300 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
32310 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
32320 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
32330 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
32340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32350 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32360 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
32370 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
32380 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
32390 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
323a0 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
323b0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
323c0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
323d0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
323e0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
323f0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
32400 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
32410 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
32420 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
32430 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32440 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
32450 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32460 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
32470 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
32480 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
32490 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
324a0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
324b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
324c0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
324d0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
324e0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
324f0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
32500 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
32510 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
32520 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
32530 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
32540 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
32550 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
32560 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
32570 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
32580 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
32590 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
325a0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
325b0 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
325c0 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
325d0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
325e0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
325f0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
32600 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
32610 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
32620 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
32630 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
32640 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
32650 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
32660 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
32670 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
32680 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
32690 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
326a0 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
326b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
326c0 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
326d0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
326e0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
326f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32700 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
32710 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
32720 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
32730 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
32740 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
32750 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
32760 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
32770 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
32780 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32790 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
327a0 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
327b0 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
327c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
327d0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
327e0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
327f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
32800 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
32810 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
32820 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
32830 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
32840 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
32850 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
32860 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
32870 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
32880 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
32890 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
328a0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
328b0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
328c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
328d0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
328e0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
328f0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
32900 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
32910 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
32920 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
32930 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
32940 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
32950 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
32960 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
32970 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
32980 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
32990 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
329a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
329b0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
329c0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
329d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
329e0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
329f0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
32a00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32a10 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
32a20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
32a30 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
32a40 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
32a50 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
32a60 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
32a70 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
32a80 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
32a90 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
32aa0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
32ab0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
32ac0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
32ad0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
32ae0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
32af0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
32b00 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
32b10 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
32b20 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
32b30 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
32b40 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
32b50 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
32b60 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
32b70 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
32b80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
32b90 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
32ba0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32bb0 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
32bc0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
32bd0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
32be0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
32bf0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
32c00 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
32c10 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
32c20 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
32c30 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
32c40 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
32c50 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
32c60 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
32c70 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
32c80 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
32c90 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
32ca0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
32cb0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
32cc0 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
32cd0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
32ce0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
32cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
32d00 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
32d10 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
32d20 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
32d30 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
32d40 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
32d50 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
32d60 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
32d70 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
32d80 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
32d90 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
32da0 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
32db0 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
32dc0 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
32dd0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
32de0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
32df0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32e00 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
32e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32e20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
32e30 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
32e40 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
32e50 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
32e60 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
32e70 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
32e80 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
32e90 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
32ea0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
32eb0 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
32ec0 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
32ed0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
32ee0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
32ef0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
32f00 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
32f10 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
32f20 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
32f30 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
32f40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
32f50 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
32f60 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
32f70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
32f80 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
32f90 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
32fa0 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
32fb0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
32fc0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
32fd0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
32fe0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
32ff0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
33000 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
33010 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
33020 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
33030 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
33040 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
33050 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
33060 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
33070 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
33080 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
33090 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e  g of the header.
330a0 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20    0 most pages. 
330b0 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a   100 page 1 */..
330c0 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
330d0 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
330e0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
330f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
33100 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
33110 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
33120 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
33130 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
33140 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33150 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
33160 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
33170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
33180 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
33190 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
331a0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
331b0 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
331c0 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
331d0 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
331e0 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
331f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
33200 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
33210 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
33220 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
33230 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
33240 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
33250 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
33260 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
33270 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
33280 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
33290 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
332a0 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
332b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
332c0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
332d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
332e0 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
332f0 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
33300 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
33310 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
33320 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
33330 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  -;.  if( pPage->
33340 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  nCell==0 ){.    
33350 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
33360 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  +1], 0, 4);.    
33370 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
33380 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
33390 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67  ata[hdr+5], pPag
333a0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
333b0 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze);.    pPage->
333c0 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70  nFree = pPage->p
333d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
333e0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
333f0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
33400 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65           - pPage
33410 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d  ->childPtrSize -
33420 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   8;.  }else{.   
33430 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74   memmove(ptr, pt
33440 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e  r+2, 2*(pPage->n
33450 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20  Cell - idx));.  
33460 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
33470 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
33480 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
33490 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
334a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65   }.}../*.** Inse
334b0 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
334c0 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
334d0 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
334e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
334f0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
33500 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
33510 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
33520 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
33530 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
33540 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
33550 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
33560 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
33570 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
33580 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
33590 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
335a0 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
335b0 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
335c0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
335d0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
335e0 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
335f0 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
33600 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
33610 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
33620 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
33630 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
33640 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
33650 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
33660 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
33670 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
33680 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
33690 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
336a0 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
336b0 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ented..*/.static
336c0 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c   void insertCell
336d0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
336e0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
336f0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
33700 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
33710 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
33720 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
33730 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
33740 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
33750 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
33760 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
33770 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
33780 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
33790 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
337a0 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
337b0 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
337c0 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
337d0 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
337e0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
337f0 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  eded */.  Pgno i
33800 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49  Child,      /* I
33810 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c  f non-zero, repl
33820 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65  ace first 4 byte
33830 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75  s with this valu
33840 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20  e */.  int *pRC 
33850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
33860 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72   and write retur
33870 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65  n code from here
33880 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
33890 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68   = 0;      /* Wh
338a0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
338b0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
338c0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
338d0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
338e0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
338f0 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
33900 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
33910 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
33920 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
33930 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
33940 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
33950 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
33960 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
33970 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
33980 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
33990 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
339a0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
339b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
339c0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
339d0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
339e0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
339f0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
33a00 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
33a10 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
33a20 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
33a30 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
33a40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
33a50 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
33a60 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
33a70 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
33a80 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
33a90 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
33aa0 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
33ab0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
33ac0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
33ad0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
33ae0 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
33af0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
33b00 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
33b10 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
33b20 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
33b30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33b40 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33b50 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33b60 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
33b70 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
33b80 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
33b90 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
33ba0 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
33bb0 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
33bc0 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
33bd0 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
33be0 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
33bf0 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
33c00 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
33c10 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
33c20 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
33c30 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
33c40 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
33c50 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
33c60 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
33c70 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
33c80 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
33c90 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
33ca0 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
33cb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
33cc0 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
33cd0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
33ce0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
33cf0 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
33d00 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
33d10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
33d20 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
33d30 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
33d40 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
33d50 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43  memcpy(pTemp, pC
33d60 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  ell, sz);.      
33d70 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
33d80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
33d90 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
33da0 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
33db0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
33dc0 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
33dd0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
33de0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
33df0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
33e00 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
33e10 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20  apOvfl[0])) );. 
33e20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
33e30 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
33e40 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
33e50 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  ] = (u16)i;.  }e
33e60 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
33e70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
33e80 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
33e90 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
33ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33eb0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
33ec0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
33ed0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
33ee0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33ef0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
33f00 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
33f10 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
33f20 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
33f30 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
33f40 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
33f50 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
33f60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
33f70 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
33f80 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
33f90 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
33fa0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
33fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
33fc0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
33fd0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
33fe0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
33ff0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
34000 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
34010 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
34020 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
34030 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
34040 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
34050 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
34060 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
34070 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
34080 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
34090 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
340a0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
340b0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
340c0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
340d0 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
340e0 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
340f0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
34100 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
34110 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
34120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d  ;.    }.    memm
34130 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d  ove(&data[ins+2]
34140 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e  , &data[ins], en
34150 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32  d-ins);.    put2
34160 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
34170 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
34180 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
34190 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
341a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
341b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
341c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
341d0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
341e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
341f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
34200 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
34210 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
34220 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
34230 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
34240 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
34250 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
34260 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
34270 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
34280 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
34290 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
342a0 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
342b0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
342c0 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
342d0 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
342e0 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20  inters to nCell 
342f0 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c  b-tree page cell
34300 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c  s. The .** szCel
34310 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  l[] array contai
34320 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
34330 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c  ytes of each cel
34340 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
34350 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65  .** replaces the
34360 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
34370 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69  s of page pPg wi
34380 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
34390 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61  of the cell.** a
343a0 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rray..**.** Some
343b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
343c0 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75   apCell[] may cu
343d0 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
343e0 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a  d in pPg. This.*
343f0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  * function works
34400 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
34410 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20   caused by this 
34420 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  by making a copy
34430 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68   of any .** such
34440 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76   cells before ov
34450 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  erwriting the pa
34460 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  ge data..**.** T
34470 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65  he MemPage.nFree
34480 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
34490 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  dated by this fu
344a0 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  nction. It is th
344b0 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
344c0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
344d0 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
344e0 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
344f0 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64 50 61  c void rebuildPa
34500 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
34510 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
34520 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
34530 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
34540 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
34550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34560 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
34570 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
34580 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345a0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
345b0 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
345c0 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
345d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
345e0 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
345f0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
34600 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
34610 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
34620 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
34630 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
34640 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
34650 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
34660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34670 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
34680 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
34690 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
346a0 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
346b0 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
346c0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
346d0 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
346e0 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
346f0 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
34700 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
34710 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
34720 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
34730 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
34740 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
34750 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
34760 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
34770 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
34780 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
34790 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
347a0 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
347b0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
347c0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
347d0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
347e0 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61  .    if( pCell>a
347f0 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45  Data && pCell<pE
34800 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c  nd ){.      pCel
34810 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20  l = &pTmp[pCell 
34820 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a  - aData];.    }.
34830 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43      pData -= szC
34840 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  ell[i];.    memc
34850 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c  py(pData, pCell,
34860 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   szCell[i]);.   
34870 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
34880 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61  tr, (pData - aDa
34890 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
348a0 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 61 73 73  tr += 2;.    ass
348b0 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
348c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 67 2c  cellSizePtr(pPg,
348d0 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
348e0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
348f0 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
34900 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
34910 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a  g,pCell) );.  }.
34920 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e  .  /* The pPg->n
34930 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f  Free field is no
34940 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  w set incorrectl
34950 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  y. The caller wi
34960 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20  ll fix it. */.  
34970 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  pPg->nCell = nCe
34980 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72  ll;.  pPg->nOver
34990 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74  flow = 0;..  put
349a0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
349b0 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62  +1], 0);.  put2b
349c0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
349d0 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
349e0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
349f0 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
34a00 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74  - aData);.  aDat
34a10 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b  a[hdr+7] = 0x00;
34a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
34a30 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
34a40 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
34a50 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
34a60 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a  . Array szCell.*
34a70 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  * contains the s
34a80 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
34a90 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20  each such cell. 
34aa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
34ab0 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64  tempts to .** ad
34ac0 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72  d the cells stor
34ad0 65 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ed in the array 
34ae0 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  to page pPg. If 
34af0 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75  it cannot (becau
34b00 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  se .** the page 
34b10 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72  needs to be defr
34b20 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20  agmented before 
34b30 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  the cells will f
34b40 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  it), non-zero.**
34b50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
34b60 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
34b70 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20  cells are added 
34b80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65  successfully, ze
34b90 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  ro is.** returne
34ba0 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
34bb0 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74  t pCellptr point
34bc0 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  s to the first e
34bd0 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c  ntry in the cell
34be0 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a  -pointer array.*
34bf0 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20  * (part of page 
34c00 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65  pPg) to populate
34c10 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43  . After cell apC
34c20 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65  ell[0] is writte
34c30 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65  n to the.** page
34c40 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20   body, a 16-bit 
34c50 6f 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65  offset is writte
34c60 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41  n to pCellptr. A
34c70 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61  nd so on, for ea
34c80 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68  ch.** cell in th
34c90 65 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74  e array. It is t
34ca0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
34cb0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
34cc0 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
34cd0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
34ce0 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70  overwrite this p
34cf0 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
34d00 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a  pointer array..*
34d10 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
34d20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
34d30 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74  d, *ppData point
34d40 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
34d50 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  f the .** conten
34d60 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70  t area on page p
34d70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20  Pg. If the size 
34d80 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
34d90 72 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c  rea is extended,
34da0 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75  .** *ppData is u
34db0 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20  pdated to point 
34dc0 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74  to the new start
34dd0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
34de0 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72  area.** before r
34df0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
34e00 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e  Finally, argumen
34e10 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20  t pBegin points 
34e20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65  to the byte imme
34e30 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
34e40 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  g the.** end of 
34e50 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
34e60 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20  ed by this page 
34e70 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69  for the cell-poi
34e80 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a  nter area (for.*
34e90 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f  * all cells - no
34ea0 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73  t just those ins
34eb0 65 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72  erted by the cur
34ec0 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74  rent call). If t
34ed0 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72  he content.** ar
34ee0 65 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e  ea must be exten
34ef0 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68  ded to before th
34f00 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
34f10 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  r to accomodate 
34f20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20  all.** cells in 
34f30 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74  apCell[], then t
34f40 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20  he cells do not 
34f50 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  fit and non-zero
34f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
34f70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
34f80 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d  InsertArray(.  M
34f90 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
34fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34fb0 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65  * Page to add ce
34fc0 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a  lls to */.  u8 *
34fd0 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20  pBegin,         
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34ff0 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74  nd of cell-point
35000 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38  er array */.  u8
35010 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20   **ppData,      
35020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35030 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f   IN/OUT: Page co
35040 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e  ntent -area poin
35050 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
35060 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20  llptr,          
35070 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
35080 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e  ter to cell-poin
35090 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ter area */.  in
350a0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
350b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
350c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
350d0 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a   to add to pPg *
350e0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
350f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35100 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
35110 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
35120 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
35130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
35140 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
35150 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
35160 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70  .  u8 *aData = p
35170 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  Pg->aData;.  u8 
35180 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61  *pData = *ppData
35190 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 46  ;.  const int bF
351a0 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74 61 5b  reelist = aData[
351b0 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d 3b 0a  1] || aData[2];.
351c0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
351d0 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72  T_DB || pPg->hdr
351e0 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
351f0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
35200 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66  on page 1 */.  f
35210 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
35220 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73   i++){.    int s
35230 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20  z = szCell[i];. 
35240 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
35250 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 69 66  8 *pSlot;.    if
35260 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30 20 7c  ( bFreelist==0 |
35270 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46  | (pSlot = pageF
35280 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73 7a 2c  indSlot(pPg, sz,
35290 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29 7b 0a   &rc, 0))==0 ){.
352a0 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73        pData -= s
352b0 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  z;.      if( pDa
352c0 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75  ta<pBegin ) retu
352d0 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f  rn 1;.      pSlo
352e0 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d  t = pData;.    }
352f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f  .    memcpy(pSlo
35300 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  t, apCell[i], sz
35310 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
35320 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74  pCellptr, (pSlot
35330 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
35340 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
35350 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70   }.  *ppData = p
35360 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
35370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
35380 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
35390 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
353a0 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
353b0 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20  s. Array szCell 
353c0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
353d0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
353e0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
353f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
35400 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63  adds the.** spac
35410 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
35420 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74  h each cell in t
35430 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73  he array that is
35440 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
35450 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  d .** within the
35460 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20   body of pPg to 
35470 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73  the pPg free-lis
35480 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  t. The cell-poin
35490 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a  ters and other.*
354a0 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  * fields of the 
354b0 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64  page are not upd
354c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
354d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
354e0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
354f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65  er of cells adde
35500 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
35510 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
35520 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  t pageFreeArray(
35530 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
35540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35550 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64     /* Page to ed
35560 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  it */.  int nCel
35570 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
35580 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73          /* Cells
35590 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
355a0 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
355b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355c0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
355d0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  s */.  u16 *szCe
355e0 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ll              
355f0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
35600 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f  of cell sizes */
35610 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
35620 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
35630 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
35640 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
35650 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
35660 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f  Size];.  u8 * co
35670 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44  nst pStart = &aD
35680 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73  ata[pPg->hdrOffs
35690 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68  et + 8 + pPg->ch
356a0 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69  ildPtrSize];.  i
356b0 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69  nt nRet = 0;.  i
356c0 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46 72 65  nt i;.  u8 *pFre
356d0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46  e = 0;.  int szF
356e0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  ree = 0;..  for(
356f0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
35700 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
35710 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20  l = apCell[i];. 
35720 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53     if( pCell>=pS
35730 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45  tart && pCell<pE
35740 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nd ){.      int 
35750 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  sz = szCell[i];.
35760 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21        if( pFree!
35770 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b  =(pCell + sz) ){
35780 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
35790 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
357a0 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44  assert( pFree>aD
357b0 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20  ata && (pFree - 
357c0 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a  aData)<65536 );.
357d0 20 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70            freeSp
357e0 61 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70  ace(pPg, (u16)(p
357f0 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73  Free - aData), s
35800 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  zFree);.        
35810 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20  }.        pFree 
35820 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20  = pCell;.       
35830 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20   szFree = sz;.  
35840 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 2b        if( pFree+
35850 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e  sz>pEnd ) return
35860 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
35870 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
35880 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
35890 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20  szFree += sz;.  
358a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74      }.      nRet
358b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
358c0 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
358d0 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61   assert( pFree>a
358e0 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d  Data && (pFree -
358f0 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b   aData)<65536 );
35900 0a 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70  .    freeSpace(p
35910 50 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20  Pg, (u16)(pFree 
35920 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65  - aData), szFree
35930 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
35940 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61  nRet;.}../*.** a
35950 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65  pCell[] and szCe
35960 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
35970 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69  inters to and si
35980 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
35990 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73   in the.** pages
359a0 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e   being balanced.
359b0 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61    The current pa
359c0 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67  ge, pPg, has pPg
359d0 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74  ->nCell cells st
359e0 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61  arting.** with a
359f0 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66  pCell[iOld].  Af
35a00 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  ter balancing, t
35a10 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c 64 20  his page should 
35a20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c 73 0a  hold nNew cells.
35a30 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 61  ** starting at a
35a40 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a  pCell[iNew]..**.
35a50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
35a60 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73  makes the necess
35a70 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ary adjustments 
35a80 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74 20 69  to pPg so that i
35a90 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  t contains.** th
35aa0 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c 73 20  e correct cells 
35ab0 61 66 74 65 72 20 62 65 69 6e 67 20 62 61 6c 61  after being bala
35ac0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nced..**.** The 
35ad0 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
35ae0 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68 65 6e   is invalid when
35af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
35b00 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20 74 68  eturns. It is th
35b10 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c  e.** responsibil
35b20 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
35b30 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72  r to set it corr
35b40 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
35b50 20 76 6f 69 64 20 65 64 69 74 50 61 67 65 28 0a   void editPage(.
35b60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
35b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b80 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
35b90 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6c  age */.  int iOl
35ba0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
35bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35bc0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
35bd0 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61 67  currently on pag
35be0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 2c  e */.  int iNew,
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c00 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35c10 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63 65 6c  of new first cel
35c20 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  l on page */.  i
35c30 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20 20  nt nNew,        
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35c50 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f  * Final number o
35c60 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20  f cells on page 
35c70 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
35c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35c90 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
35ca0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20   cells */.  u16 
35cb0 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20  *szCell         
35cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
35cd0 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a  rray of cell siz
35ce0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  es */.){.  u8 * 
35cf0 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
35d00 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73  g->aData;.  cons
35d10 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
35d20 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
35d30 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d   *pBegin = &pPg-
35d40 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a  >aCellIdx[nNew *
35d50 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c   2];.  int nCell
35d60 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20   = pPg->nCell;  
35d70 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74       /* Cells st
35d80 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ored on pPg */. 
35d90 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38   u8 *pData;.  u8
35da0 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e   *pCellptr;.  in
35db0 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45  t i;.  int iOldE
35dc0 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d  nd = iOld + pPg-
35dd0 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f  >nCell + pPg->nO
35de0 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69  verflow;.  int i
35df0 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20  NewEnd = iNew + 
35e00 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
35e10 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
35e20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
35e30 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
35e40 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
35e50 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20  .  memcpy(pTmp, 
35e60 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d  aData, pPg->pBt-
35e70 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65  >usableSize);.#e
35e80 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ndif..  /* Remov
35e90 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  e cells from the
35ea0 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 6f   start and end o
35eb0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35ec0 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b  if( iOld<iNew ){
35ed0 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74 20  .    int nShift 
35ee0 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
35ef0 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 69 4e  .        pPg, iN
35f00 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65 6c 6c  ew-iOld, &apCell
35f10 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b  [iOld], &szCell[
35f20 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20 20 20  iOld].    );.   
35f30 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e 61 43   memmove(pPg->aC
35f40 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e 61 43  ellIdx, &pPg->aC
35f50 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a 32 5d  ellIdx[nShift*2]
35f60 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20  , nCell*2);.    
35f70 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66 74 3b  nCell -= nShift;
35f80 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65 77 45  .  }.  if( iNewE
35f90 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29 7b 0a  nd < iOldEnd ){.
35fa0 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70 61 67      nCell -= pag
35fb0 65 46 72 65 65 41 72 72 61 79 28 0a 20 20 20 20  eFreeArray(.    
35fc0 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45 6e 64      pPg, iOldEnd
35fd0 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43 65 6c  -iNewEnd, &apCel
35fe0 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73 7a 43  l[iNewEnd], &szC
35ff0 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20 20 20  ell[iNewEnd].   
36000 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61   );.  }..  pData
36010 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32 62 79   = &aData[get2by
36020 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61 74 61  teNotZero(&aData
36030 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28  [hdr+5])];.  if(
36040 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20   pData<pBegin ) 
36050 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
36060 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65  il;..  /* Add ce
36070 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  lls to the start
36080 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
36090 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20    if( iNew<iOld 
360a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64 64 20  ){.    int nAdd 
360b0 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c 64 2d  = MIN(nNew,iOld-
360c0 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73 65 72  iNew);.    asser
360d0 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29 3c 6e  t( (iOld-iNew)<n
360e0 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d 30 20  New || nCell==0 
360f0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36100 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  .    pCellptr = 
36110 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20  pPg->aCellIdx;. 
36120 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c     memmove(&pCel
36130 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20 70 43  lptr[nAdd*2], pC
36140 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a 32 29  ellptr, nCell*2)
36150 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 49 6e  ;.    if( pageIn
36160 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
36170 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69 6e       pPg, pBegin
36180 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c 70  , &pData, pCellp
36190 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 41  tr,.          nA
361a0 64 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77  dd, &apCell[iNew
361b0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d  ], &szCell[iNew]
361c0 0a 20 20 20 20 29 20 29 20 67 6f 74 6f 20 65 64  .    ) ) goto ed
361d0 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20  itpage_fail;.   
361e0 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a   nCell += nAdd;.
361f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6e    }..  /* Add an
36200 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  y overflow cells
36210 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
36220 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  <pPg->nOverflow;
36230 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
36240 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b 20 70  Cell = (iOld + p
36250 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29 20 2d  Pg->aiOvfl[i]) -
36260 20 69 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69   iNew;.    if( i
36270 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65 6c 6c  Cell>=0 && iCell
36280 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 70  <nNew ){.      p
36290 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67 2d 3e  Cellptr = &pPg->
362a0 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c 20 2a  aCellIdx[iCell *
362b0 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f   2];.      memmo
362c0 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32 5d 2c  ve(&pCellptr[2],
362d0 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43 65 6c   pCellptr, (nCel
362e0 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32 29 3b  l - iCell) * 2);
362f0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
36300 20 20 20 20 20 20 69 66 28 20 70 61 67 65 49 6e        if( pageIn
36310 73 65 72 74 41 72 72 61 79 28 0a 20 20 20 20 20  sertArray(.     
36320 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67         pPg, pBeg
36330 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c  in, &pData, pCel
36340 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  lptr,.          
36350 20 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69 43 65    1, &apCell[iCe
36360 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73 7a 43  ll + iNew], &szC
36370 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e 65 77  ell[iCell + iNew
36380 5d 0a 20 20 20 20 20 20 29 20 29 20 67 6f 74 6f  ].      ) ) goto
36390 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a   editpage_fail;.
363a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
363b0 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20  Append cells to 
363c0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
363d0 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74  age */.  pCellpt
363e0 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
363f0 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69  dx[nCell*2];.  i
36400 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
36410 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c  ay(.        pPg,
36420 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c   pBegin, &pData,
36430 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20   pCellptr,.     
36440 20 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c 20 26     nNew-nCell, &
36450 61 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c  apCell[iNew+nCel
36460 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  l], &szCell[iNew
36470 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20 67 6f  +nCell].  ) ) go
36480 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
36490 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20  ;..  pPg->nCell 
364a0 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d 3e 6e  = nNew;.  pPg->n
364b0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
364c0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
364d0 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
364e0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
364f0 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20  (&aData[hdr+5], 
36500 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a  pData - aData);.
36510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
36520 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
36530 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52 52 55  i<nNew && !CORRU
36540 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20 20 20  PT_DB; i++){.   
36550 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
36560 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20 20 20  ell[i+iNew];.   
36570 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65 74 32   int iOff = get2
36580 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65 6c 6c  byte(&pPg->aCell
36590 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20 20 69  Idx[i*2]);.    i
365a0 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74 61 20  f( pCell>=aData 
365b0 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74 61 5b  && pCell<&aData[
365c0 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
365d0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 70  Size] ){.      p
365e0 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
365f0 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
36600 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 30   }.    assert( 0
36610 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c 2c 20  ==memcmp(pCell, 
36620 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20 73 7a  &aData[iOff], sz
36630 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20 29 3b  Cell[i+iNew]) );
36640 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
36650 65 74 75 72 6e 3b 0a 20 65 64 69 74 70 61 67 65  eturn;. editpage
36660 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e 61 62  _fail:.  /* Unab
36670 6c 65 20 74 6f 20 65 64 69 74 20 74 68 69 73 20  le to edit this 
36680 70 61 67 65 2e 20 52 65 62 75 69 6c 64 20 69 74  page. Rebuild it
36690 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20 69 6e   from scratch in
366a0 73 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65 62 75  stead. */.  rebu
366b0 69 6c 64 50 61 67 65 28 70 50 67 2c 20 6e 4e 65  ildPage(pPg, nNe
366c0 77 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 5d  w, &apCell[iNew]
366d0 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77 5d 29  , &szCell[iNew])
366e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
366f0 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
36700 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
36710 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
36720 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
36730 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
36740 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
36750 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
36760 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
36770 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
36780 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
36790 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
367a0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
367b0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
367c0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
367d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
367e0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
367f0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
36800 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
36810 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
36820 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
36830 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
36840 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
36850 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
36860 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
36870 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
36880 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
36890 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
368a0 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
368b0 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
368c0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
368d0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
368e0 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
368f0 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
36900 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
36910 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
36920 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
36930 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
36940 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
36950 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
36960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
36970 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
36980 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
36990 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
369a0 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
369b0 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
369c0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
369d0 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
369e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
369f0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
36a00 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
36a10 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
36a20 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
36a30 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
36a40 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
36a50 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
36a60 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
36a70 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
36a80 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
36a90 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
36aa0 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
36ab0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
36ac0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
36ad0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
36ae0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
36af0 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74  ing to balance t
36b00 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
36b10 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
36b20 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
36b30 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
36b40 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
36b50 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
36b60 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
36b70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
36b80 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
36b90 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
36ba0 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
36bb0 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
36bc0 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
36bd0 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
36be0 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
36bf0 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
36c00 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
36c10 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
36c20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
36c30 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
36c40 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
36c50 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
36c60 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
36c70 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
36c80 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
36c90 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
36ca0 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
36cb0 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
36cc0 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
36cd0 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
36ce0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
36cf0 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
36d00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
36d10 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
36d20 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
36d30 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
36d40 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
36d50 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
36d60 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
36d70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
36d80 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
36d90 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
36da0 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
36db0 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
36dc0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
36dd0 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
36de0 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
36df0 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
36e00 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
36e10 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
36e20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
36e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36e40 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
36e50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
36e60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
36e70 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
36e80 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
36e90 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
36ea0 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
36eb0 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
36ec0 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
36ef0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
36f00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
36f30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36f40 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
36f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
36f60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
36f70 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
36f80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36f90 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
36fa0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
36fb0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36fc0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
36fd0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
36fe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36ff0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
37000 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72  ;..  /* This err
37010 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20  or condition is 
37020 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72  now caught prior
37030 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69   to reaching thi
37040 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
37050 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 2d  if( NEVER(pPage-
37060 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 20 72 65 74  >nCell==0) ) ret
37070 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
37080 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
37090 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
370a0 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
370b0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
370c0 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
370d0 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
370e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
370f0 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
37100 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
37110 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
37120 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
37130 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
37140 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
37150 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
37160 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
37170 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
37180 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
37190 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
371a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
371b0 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
371c0 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
371d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
371e0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  Page->apOvfl[0];
371f0 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
37200 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
37210 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
37220 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
37230 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37240 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
37250 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
37260 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
37270 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
37280 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
37290 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
372a0 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
372b0 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
372c0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
372d0 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
372e0 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e 65 77  rebuildPage(pNew
372f0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
37300 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d  Cell);.    pNew-
37310 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73  >nFree = pBt->us
37320 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65 77 2d  ableSize - pNew-
37330 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20 32 20  >cellOffset - 2 
37340 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20 20 2f  - szCell;..    /
37350 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
37360 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
37370 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
37380 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
37390 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
373a0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
373b0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
373c0 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
373d0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
373e0 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
373f0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
37400 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
37410 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
37420 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
37430 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
37440 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
37450 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
37460 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
37470 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
37480 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
37490 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
374a0 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
374b0 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
374c0 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
374d0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
374e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
374f0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
37500 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
37510 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
37520 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
37530 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
37540 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37550 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
37560 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
37570 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
37580 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
37590 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
375a0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
375b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
375c0 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
375d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
375e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
375f0 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
37600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37610 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
37620 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
37630 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
37640 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
37650 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
37660 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
37670 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
37680 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
37690 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
376a0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
376b0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
376c0 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
376d0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
376e0 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
376f0 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
37700 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
37710 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
37720 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
37730 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
37740 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
37750 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
37760 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
37770 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
37780 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
37790 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
377a0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
377b0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
377c0 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
377d0 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
377e0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
377f0 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
37800 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
37810 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
37820 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
37830 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
37840 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
37850 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
37860 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
37870 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
37880 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
37890 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
378a0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
378b0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
378c0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
378d0 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
378e0 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
378f0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
37900 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
37910 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
37920 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
37930 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
37940 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
37950 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
37960 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
37970 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
37980 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
37990 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
379a0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
379b0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
379c0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
379d0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
379e0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
379f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
37a00 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
37a10 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
37a20 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
37a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37a40 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
37a50 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
37a60 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
37a70 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
37a80 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
37a90 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
37aa0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
37ab0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
37ac0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
37ad0 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
37ae0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
37af0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
37b00 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
37b10 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
37b20 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
37b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
37b40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37b50 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
37b60 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
37b70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
37b80 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
37b90 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
37ba0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
37bb0 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
37bc0 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
37bd0 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
37be0 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
37bf0 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
37c00 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
37c10 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
37c20 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
37c30 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
37c40 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
37c50 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
37c60 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
37c70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
37c80 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
37c90 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
37ca0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
37cb0 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
37cc0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
37cd0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
37ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37cf0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
37d00 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
37d10 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
37d20 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
37d30 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
37d40 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
37d50 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
37d60 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
37d70 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
37d80 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
37d90 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
37da0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
37db0 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
37dc0 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
37dd0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
37de0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
37df0 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
37e00 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
37e10 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
37e20 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
37e30 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
37e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
37e50 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
37e60 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
37e70 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
37e80 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
37e90 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
37ea0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
37eb0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
37ec0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
37ed0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
37ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
37ef0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
37f00 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
37f10 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
37f20 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
37f30 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
37f40 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
37f50 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
37f60 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
37f70 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
37f80 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
37f90 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
37fa0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
37fb0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
37fc0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37fd0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
37fe0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
37ff0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
38000 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
38010 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
38020 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
38030 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
38040 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
38050 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
38060 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
38070 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
38080 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
38090 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
380a0 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
380b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
380c0 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
380d0 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
380e0 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
380f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
38100 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
38110 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
38120 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
38130 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
38140 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
38150 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
38160 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
38170 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
38180 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
38190 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
381a0 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
381b0 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
381c0 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  apOvfl[] array),
381d0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
381e0 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
381f0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
38200 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
38210 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
38220 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
38230 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
38240 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
38250 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
38260 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
38270 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
38280 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
38290 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
382a0 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
382b0 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
382c0 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
382d0 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
382e0 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
382f0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
38300 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
38310 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
38320 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
38330 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
38340 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
38350 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
38360 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
38370 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
38380 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
38390 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
383a0 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
383b0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
383c0 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
383d0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
383e0 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
383f0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
38400 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
38410 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
38420 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
38430 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
38440 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
38450 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
38460 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
384