/ Hex Artifact Content
Login

Artifact b184ce6d483dfadc53126a4b7994633ec0d5ef5f:


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 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   = -1;.}.../*.**
4ef0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
4f00: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
4f10: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
4f20: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
4f30: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
4f40: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
4f50: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
4f60: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
4f70: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
4f80: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
4f90: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
4fa0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
4fb0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
4fc0: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
4fd0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
4fe0: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5000: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5010: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5020: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5030: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5040: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5050: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5060: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5070: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5080: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5090: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
50a0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
50b0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
50c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
50d0: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
50e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
50f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5100: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5110: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5130: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5140: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5150: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
5160: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
5170: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
5180: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
5190: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
51a0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
51b0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
51c0: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
51d0: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
51e0: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
51f0: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5200: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5210: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5220: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5230: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5240: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5250: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
5260: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
5270: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
5280: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
5290: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
52a0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
52b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
52c0: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
52d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
52e0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
52f0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
5300: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
5310: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5320: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
5330: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5340: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5350: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5360: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5370: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5380: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
53a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
53b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
53c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
53d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
53e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
53f0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
5400: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20  pCur->pKey );.. 
5410: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5420: 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52  OK ){.    btreeR
5430: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
5440: 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20  ages(pCur);.    
5450: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5460: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5470: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5480: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5490: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
54a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
54b0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
54c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
54d0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
54e0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
54f0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5500: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
5510: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5520: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5530: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5540: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5550: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5560: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5570: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5580: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5590: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
55a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
55b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
55c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
55d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
55e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
55f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5600: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5610: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5620: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5630: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5640: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5650: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5660: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5670: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5680: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5690: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
56a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
56b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
56c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
56d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
56e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
56f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5700: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5710: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5720: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5730: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5740: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5750: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5760: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5770: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5780: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5790: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
57a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
57b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
57c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
57d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
57e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
57f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5800: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5810: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5820: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5830: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5840: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5850: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5860: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5870: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5880: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5890: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
58a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
58b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
58c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
58d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
58e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
58f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5910: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5920: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5930: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5940: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5960: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5970: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5980: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5990: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
59a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
59b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
59c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
59d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
59e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
59f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5a00: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5a10: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5a20: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5a30: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a40: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a50: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a60: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5a70: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5a80: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5a90: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5aa0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5ab0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5ac0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5ad0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5ae0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5af0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5b00: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5b10: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5b20: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5b30: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5b40: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5b50: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5b60: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5b70: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5b80: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5b90: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
5ba0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
5bb0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
5bc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
5bd0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
5be0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
5bf0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5c00: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5c10: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5c20: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5c30: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5c40: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5c50: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5c60: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5c70: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5c80: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5c90: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
5ca0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
5cb0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
5cc0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
5cd0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
5ce0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
5cf0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5d00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5d10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5d20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5d30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5d40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5d50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5d60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5d70: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
5d80: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
5d90: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
5da0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
5db0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
5dc0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
5dd0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
5de0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5df0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
5e10: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
5e20: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
5e30: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
5e40: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
5e50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
5e60: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
5e70: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
5e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
5eb0: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
5ec0: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
5ed0: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
5ee0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
5ef0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5f00: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5f20: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
5f30: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5f40: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f50: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
5f70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
5f80: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
5f90: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
5fa0: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
5fb0: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
5fc0: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
5fd0: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
5fe0: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
5ff0: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6000: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
6010: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
6020: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
6030: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
6040: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
6050: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
6060: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6070: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6080: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6090: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
60a0: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
60b0: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
60c0: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
60d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
60e0: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
60f0: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6100: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
6110: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
6120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
6130: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
6140: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
6150: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
6160: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6170: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6180: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61a0: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
61b0: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
61c0: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
61d0: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
61e0: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
61f0: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6200: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
6210: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
6220: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
6230: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
6240: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
6250: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6260: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6270: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6280: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6290: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
62a0: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
62b0: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
62c0: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
62d0: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
62e0: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
62f0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6300: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6310: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
6320: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
6330: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
6340: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
6350: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
6360: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6380: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6390: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
63a0: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
63b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
63c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
63d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
63e0: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
63f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6400: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
6410: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
6420: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
6430: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
6440: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
6450: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
6460: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6470: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6480: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6490: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
64a0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
64b0: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
64c0: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
64d0: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
64e0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
64f0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6500: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
6510: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
6520: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
6530: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
6540: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6550: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
6560: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6570: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6580: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6590: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
65a0: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
65b0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
65c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
65d0: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
65e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
65f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6600: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6610: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6620: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
6630: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
6640: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
6650: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6660: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
6670: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6680: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
6690: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
66a0: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
66b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
66c0: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
66d0: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
66e0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
66f0: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
6700: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
6710: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6730: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6740: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6750: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6760: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6770: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6780: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6790: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
67a0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
67b0: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
67c0: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
67d0: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
67e0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
67f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
6800: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6810: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
6820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6830: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
6840: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6850: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6860: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6870: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6880: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6890: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
68a0: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
68b0: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
68c0: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
68d0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
68e0: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
68f0: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
6900: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
6910: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
6920: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
6930: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
6940: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
6950: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6960: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6970: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6980: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6990: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
69a0: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
69b0: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
69c0: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
69d0: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
69e0: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
69f0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
6a00: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
6a10: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
6a20: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
6a30: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
6a40: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
6a50: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6a60: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6a70: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6a80: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6a90: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6aa0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6ab0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
6ac0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6ad0: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
6ae0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
6af0: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
6b00: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
6b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b20: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
6b30: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6b40: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6b50: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6b60: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6b70: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6b80: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6b90: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6ba0: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6bb0: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6bc0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6bd0: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
6be0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
6bf0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
6c00: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
6c10: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
6c20: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
6c30: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6c40: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6c50: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6c60: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6c70: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6c80: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6c90: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6ca0: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6cb0: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6cc0: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6cd0: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
6ce0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
6cf0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
6d00: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
6d10: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6d20: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6d30: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6d40: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6d50: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6d60: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6d70: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6d80: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6d90: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6da0: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6db0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6dc0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6dd0: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6de0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6df0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6e00: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6e10: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6e20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6e30: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6e40: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6e50: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
6e60: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65  entRow = 1;.  }e
6e70: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
6e80: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
6e90: 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66  =0 );.    *pDiff
6ea0: 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20  erentRow = 0;.  
6eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6ec0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
6ed0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6ee0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
6ef0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6f00: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6f10: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6f20: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6f30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6f40: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6f50: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6f60: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6f70: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6f80: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6f90: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
6fa0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
6fb0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
6fc0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
6fd0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
6fe0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
6ff0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
7000: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
7010: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
7020: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
7030: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
7040: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
7050: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
7060: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
7070: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
7080: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
7090: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
70a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
70b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
70c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
70d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
70e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
70f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
7100: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
7110: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
7120: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
7130: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
7140: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
7150: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
7160: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
7170: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
7180: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
7190: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
71a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
71b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
71c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
71d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
71e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
71f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
7200: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
7210: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
7220: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
7230: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
7240: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
7250: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
7260: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
7270: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
7280: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
7290: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
72a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
72b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
72c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
72d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
72e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
72f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
7300: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
7310: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
7320: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
7330: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
7340: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
7350: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
7360: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7370: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
7380: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7390: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
73a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
73b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
73c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
73d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
73e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
73f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
7400: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
7410: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7420: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7430: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
7440: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
7450: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
7460: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7470: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7480: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
7490: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
74a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
74b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
74c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
74d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
74e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
74f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
7500: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
7510: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
7520: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
7530: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
7540: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7550: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7560: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
7570: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
7580: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
7590: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
75a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
75b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
75c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
75d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
75e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
75f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7600: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7610: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7620: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7630: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7640: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7650: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7660: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7670: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7680: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7690: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
76a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
76b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
76c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
76d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
76e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
76f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7700: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7710: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7720: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7730: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7740: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7750: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7760: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7770: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7780: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7790: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
77a0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
77b0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
77c0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
77d0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
77e0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
77f0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7800: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7810: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7820: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7830: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7840: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7850: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7860: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7870: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7880: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7890: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
78a0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
78b0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
78c0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
78d0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
78e0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
78f0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7900: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7910: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7920: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7930: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7940: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7950: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7960: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7970: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7980: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7990: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
79a0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
79b0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
79c0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
79d0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
79e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
79f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
7a00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
7a10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7a20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
7a30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
7a40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
7a50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7a70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
7a80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7a90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7aa0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7ab0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7ac0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ad0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
7ae0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
7af0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
7b00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7b10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7b20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7b30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7b40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7b50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7b60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
7b70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
7b80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
7b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7ba0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
7bb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
7bc0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
7bd0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
7be0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
7bf0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
7c00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
7c10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
7c20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
7c30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7c40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
7c50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
7c60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
7c70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
7c80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
7c90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7ca0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
7cc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
7cd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7ce0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
7cf0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7d00: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7d10: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7d20: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7d30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7d40: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7d50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7d60: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7d70: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7d80: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7d90: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
7da0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
7db0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
7dc0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
7dd0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
7de0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
7df0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7e00: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
7e10: 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  () does the same
7e20: 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73   except it skips
7e30: 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61   past the initia
7e40: 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c  l.** 4-byte chil
7e50: 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20  d pointer found 
7e60: 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  on interior page
7e70: 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  s, if there is o
7e80: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
7e90: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
7ea0: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
7eb0: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
7ec0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
7ed0: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
7ee0: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
7ef0: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
7f00: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
7f10: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
7f20: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
7f30: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
7f40: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49  dCellPastPtr(P,I
7f50: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
7f60: 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61  aOfst + ((P)->ma
7f70: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
7f80: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
7f90: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
7fa0: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ).../*.** This i
7fb0: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
7fc0: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
7fd0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7fe0: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
7ff0: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8000: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
8010: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
8020: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
8030: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
8040: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
8050: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
8060: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
8070: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
8080: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
8090: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
80a0: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
80b0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
80c0: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
80d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
80e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
80f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8100: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
8110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8120: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
8130: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
8140: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
8150: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
8160: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
8170: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
8180: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8190: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
81a0: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
81b0: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
81c0: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
81d0: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
81e0: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
81f0: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8200: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
8210: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8220: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
8230: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
8240: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
8250: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
8260: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
8270: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
8280: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
8290: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
82a0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
82b0: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
82c0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
82d0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
82e0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
82f0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
8300: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
8310: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
8320: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
8330: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
8340: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
8350: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
8360: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
8370: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
8380: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8390: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
83a0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
83b0: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
83c0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
83d0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
83e0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
83f0: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8400: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8410: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8420: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
8430: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
8440: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
8450: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8460: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8470: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8480: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8490: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
84a0: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
84b0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
84c0: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
84d0: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
84e0: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
84f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8500: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
8510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
8520: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8530: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
8540: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8550: 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  w = (u16)(&pInfo
8560: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8570: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8580: 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  l);.  pInfo->nSi
8590: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
85a0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  rflow + 4;.}../*
85b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
85c0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
85d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
85e0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
85f0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8600: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8610: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8620: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8630: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8640: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8650: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8660: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8670: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8680: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8690: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
86a0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
86b0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
86c0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
86d0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
86e0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
86f0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8700: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8710: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8720: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8730: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8740: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8750: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8760: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8770: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8780: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8790: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
87a0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
87b0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
87c0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
87d0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87e0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87f0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8800: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8810: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8820: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8830: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8840: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8850: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8860: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8870: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8880: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8890: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
88a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
88b0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
88c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
88d0: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
88e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
88f0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8910: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8920: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
8930: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
8940: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8950: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8960: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8970: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
8980: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
8990: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
89a0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  0;.  pInfo->iOve
89b0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e  rflow = 0;.  pIn
89c0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
89d0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
89e0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
89f0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
8a00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8a10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8a20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8a30: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
8a40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8a60: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8a70: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8a80: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8a90: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8aa0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
8ab0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
8ac0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
8ad0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
8ae0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
8af0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
8b00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8b10: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
8b20: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b40: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
8b50: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
8b60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8b70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8b80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
8b90: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
8ba0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
8bb0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
8bc0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
8bd0: 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d  eyLeaf || pPage-
8be0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  >noPayload );.  
8bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8c00: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
8c10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8c20: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
8c30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
8c40: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
8c50: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
8c60: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
8c70: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
8c80: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8c90: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
8ca0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8cb0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
8cc0: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
8cd0: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
8ce0: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
8cf0: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
8d00: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
8d10: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
8d20: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
8d30: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
8d40: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
8d50: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
8d60: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
8d70: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
8d80: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
8d90: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
8da0: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
8db0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
8dc0: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
8dd0: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
8de0: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
8df0: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
8e00: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
8e10: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
8e20: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
8e30: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
8e40: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
8e50: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
8e60: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
8e70: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
8e80: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
8e90: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
8ea0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
8eb0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
8ec0: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
8ed0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
8ee0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
8ef0: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
8f00: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
8f10: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
8f20: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
8f30: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
8f40: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
8f50: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
8f60: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
8f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8f80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
8f90: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
8fa0: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
8fb0: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
8fc0: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
8fd0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
8fe0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
8ff0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9000: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9010: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9020: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9030: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9040: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9050: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9060: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9070: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9080: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9090: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
90a0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
90b0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
90c0: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
90d0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
90e0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
90f0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9100: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9110: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9120: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9130: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9140: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9150: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9160: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
9170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
9180: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
9190: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91b0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
91c0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
91d0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
91e0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
91f0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9200: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9210: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9220: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9230: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9240: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9250: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9260: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
9270: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
9280: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9290: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
92a0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
92c0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
92d0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
92e0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
92f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9300: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9310: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9320: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9330: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9340: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9350: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9360: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
9370: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
9380: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9390: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
93a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
93b0: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
93c0: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
93d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
93e0: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
93f0: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9400: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9410: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9420: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9430: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9440: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9450: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9460: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9470: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9480: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
9490: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
94a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
94b0: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
94c0: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
94d0: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
94e0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
94f0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9500: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9510: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9520: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9530: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9540: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9550: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9560: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9570: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9580: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9590: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
95a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
95b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
95c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
95d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
95e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
95f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9600: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9610: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9620: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9630: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9640: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9650: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9660: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9670: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9680: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
9690: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
96a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
96b0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
96c0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
96d0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
96e0: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
96f0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9700: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9710: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9720: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9730: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9740: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9760: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9770: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9780: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9790: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
97a0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
97b0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
97c0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
97d0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
97e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
97f0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9800: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9810: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9820: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9830: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9840: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9850: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9860: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9870: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9880: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9890: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
98a0: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
98b0: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
98c0: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
98d0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
98e0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
98f0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9900: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9910: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9920: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9930: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9940: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9950: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9960: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9970: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9980: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
9990: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
99a0: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
99b0: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
99c0: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
99d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
99e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
99f0: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
9a00: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9a10: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9a20: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
9a30: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
9a40: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
9a50: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
9a80: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
9a90: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9ac0: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
9ad0: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
9ae0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
9af0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
9b00: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
9b10: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
9b20: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
9b30: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
9b40: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
9b50: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
9b60: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
9b70: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
9b80: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
9b90: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
9ba0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
9bb0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
9bc0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
9bd0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
9be0: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
9bf0: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
9c00: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
9c10: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
9c20: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
9c30: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
9c40: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
9c50: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
9c60: 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69  load==0 );.  nSi
9c70: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
9c80: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
9c90: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
9ca0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
9cb0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
9cc0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
9cd0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
9ce0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9cf0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9d00: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9d10: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9d20: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
9d30: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
9d40: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
9d50: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
9d60: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
9d70: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
9d80: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
9d90: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
9da0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
9db0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
9dc0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
9dd0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
9de0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9df0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
9e00: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
9e10: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
9e20: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
9e30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9e40: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
9e50: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
9e60: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
9e70: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
9e80: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9e90: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
9ea0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
9eb0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
9ec0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
9ed0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9ee0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9ef0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9f00: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9f10: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9f20: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9f30: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9f40: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9f50: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9f60: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9f70: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
9f80: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
9f90: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
9fa0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9fb0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9fc0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
9fd0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9fe0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9ff0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a000: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a010: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a020: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a030: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a040: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a050: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a060: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a070: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a080: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a090: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a0a0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a0b0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a0c0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a0d0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a0e0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a0f0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a100: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a110: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a120: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a130: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a140: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a150: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a160: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a170: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a180: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a190: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a1a0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a1b0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a1c0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a1d0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a1e0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a1f0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a200: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a210: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a220: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a230: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a240: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a250: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a260: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a270: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a280: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a290: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a2a0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a2c0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a2d0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a2e0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a2f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a300: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a310: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a320: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a330: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a340: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a350: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a360: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a370: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a380: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a390: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
a3a0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
a3b0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
a3c0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
a3d0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
a3e0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
a3f0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
a400: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
a410: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
a420: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
a430: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
a440: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
a450: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
a460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
a470: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
a480: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
a490: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
a4a0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
a4b0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
a4c0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
a4d0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
a4e0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
a4f0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
a500: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
a510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
a520: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
a530: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a540: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
a550: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
a560: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
a570: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
a580: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
a590: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a5a0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a5b0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
a5c0: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
a5d0: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
a5e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
a5f0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
a600: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
a610: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
a620: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
a630: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
a640: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
a650: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
a660: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
a670: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
a680: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
a690: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
a6a0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
a6b0: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
a6c0: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
a6d0: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
a6e0: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
a6f0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
a700: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
a710: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
a720: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a730: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
a740: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
a750: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
a760: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
a770: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
a780: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
a790: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
a7a0: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
a7b0: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
a7c0: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
a7d0: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
a7e0: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
a7f0: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
a800: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
a810: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
a820: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
a830: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
a840: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
a850: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
a860: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
a870: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a890: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
a8a0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a8c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
a8d0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
a8e0: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
a8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
a900: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
a910: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
a920: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a930: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a940: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
a950: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
a960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a970: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
a980: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
a990: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
a9a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
a9b0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
a9c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a9d0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
aa00: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aa10: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
aa20: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
aa30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
aa40: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
aa50: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
aa60: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
aa70: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
aa80: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
aa90: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
aaa0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
aab0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
aac0: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
aad0: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
aae0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
aaf0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
ab00: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
ab20: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
ab30: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
ab40: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
ab50: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
ab60: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
ab70: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
ab80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ab90: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
aba0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
abb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
abc0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
abd0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
abe0: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
abf0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
ac00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ac10: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
ac20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ac30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ac40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ac50: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
ac60: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
ac70: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
ac80: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
ac90: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
aca0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
acb0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
acc0: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
acd0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
ace0: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
acf0: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
ad00: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
ad10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ad20: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
ad30: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
ad40: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
ad50: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
ad60: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
ad70: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
ad80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
ad90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
ada0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
adb0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
adc0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
add0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
ade0: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
adf0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
ae00: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
ae10: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
ae20: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
ae30: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
ae40: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
ae50: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
ae60: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
ae70: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
ae80: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
ae90: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
aea0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
aeb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
aec0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
aed0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
aee0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aef0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
af00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
af10: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
af20: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
af30: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
af40: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
af50: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
af60: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
af70: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
af80: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
af90: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
afa0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
afb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
afc0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
afd0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
afe0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
aff0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b000: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b010: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b020: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b030: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b040: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b050: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b060: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b070: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b080: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b090: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b0a0: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b0b0: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b0c0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b0d0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b0e0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b0f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b100: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b110: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b120: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b130: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b140: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b150: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b160: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b170: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b180: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b190: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b1a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b1b0: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b1d0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b1e0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b1f0: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b200: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b210: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b220: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b230: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b240: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b250: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b260: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b270: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b280: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b290: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b2a0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b2b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b2c0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b2d0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b2e0: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b2f0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b300: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b310: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b320: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b330: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b340: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b350: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b360: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b370: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b380: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
b390: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
b3a0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
b3b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
b3c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
b3d0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
b3e0: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
b3f0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
b400: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
b410: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
b420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
b430: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
b440: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
b450: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
b460: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
b470: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
b480: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
b490: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
b4a0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
b4b0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
b4c0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
b4d0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
b4e0: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
b4f0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
b500: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
b510: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
b520: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
b530: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
b540: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
b550: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
b560: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
b570: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
b580: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
b590: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
b5a0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
b5b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
b5c0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
b5d0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b5e0: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
b5f0: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
b600: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
b610: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
b620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b630: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
b640: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
b650: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
b660: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
b670: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
b680: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
b690: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
b6a0: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
b6b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
b6c0: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
b6d0: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
b6e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
b6f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b700: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
b710: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
b720: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
b730: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
b740: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
b750: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
b760: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
b770: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b780: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b790: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
b7a0: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
b7b0: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
b7c0: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
b7d0: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
b7e0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
b7f0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
b800: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
b810: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
b820: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
b830: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
b840: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
b850: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
b860: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
b870: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
b880: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
b890: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
b8a0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
b8b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
b8c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
b8d0: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
b8e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
b8f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
b900: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
b910: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
b920: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
b930: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
b940: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
b950: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
b960: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
b970: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
b980: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
b990: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
b9a0: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
b9b0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
b9c0: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
b9d0: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
b9e0: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
b9f0: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
ba00: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
ba10: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
ba20: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
ba30: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
ba40: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
ba50: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
ba60: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
ba70: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
ba80: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
ba90: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
baa0: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
bab0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
bac0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
bad0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
bae0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
baf0: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
bb00: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
bb10: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
bb20: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
bb30: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
bb40: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
bb50: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bb60: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
bb70: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
bb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
bb90: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
bba0: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
bbb0: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
bbc0: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
bbd0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
bbe0: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
bbf0: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
bc00: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
bc10: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
bc20: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
bc30: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
bc40: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
bc50: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
bc60: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
bc70: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
bc80: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
bc90: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
bca0: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
bcb0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
bcc0: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
bcd0: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
bce0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
bcf0: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
bd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
bd10: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
bd20: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
bd30: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
bd40: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
bd50: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
bd60: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
bd70: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
bd80: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
bd90: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
bda0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
bdb0: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
bdc0: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
bdd0: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
bde0: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
bdf0: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
be00: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
be10: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
be20: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
be30: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
be40: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
be50: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
be60: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
be70: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
be80: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
be90: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
bea0: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
beb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
bec0: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
bed0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
bee0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
bef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bf10: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
bf20: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
bf30: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
bf40: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
bf50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bf60: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
bf70: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
bf80: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bf90: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
bfa0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
bfb0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
bfc0: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
bfd0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
bfe0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
bff0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c000: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c010: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c020: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c030: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c040: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c050: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c060: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c070: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c080: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c090: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c0a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c0b0: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c0c0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c0d0: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c0e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c0f0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c100: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c110: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c120: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c130: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c140: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c150: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c160: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c170: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c180: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c190: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c1a0: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c1b0: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c1c0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c1d0: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c1e0: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c1f0: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c200: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c210: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c220: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c230: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c240: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c250: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c260: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c270: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c280: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c290: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c2a0: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c2b0: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c2c0: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c2d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c2e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c2f0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c300: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c310: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c320: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c330: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c340: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c350: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c360: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c370: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c380: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
c390: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
c3a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c3b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3c0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
c3d0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
c3e0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
c3f0: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
c400: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
c410: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
c420: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
c430: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
c440: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
c450: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
c460: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
c470: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
c480: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
c490: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
c4a0: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
c4b0: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
c4c0: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
c4d0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
c4e0: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
c4f0: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
c500: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
c510: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
c520: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
c530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
c540: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
c550: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
c560: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
c570: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
c580: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
c590: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
c5a0: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
c5b0: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
c5c0: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
c5d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c5e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
c5f0: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
c600: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
c610: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
c620: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
c630: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
c640: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
c650: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
c660: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
c670: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
c680: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
c690: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
c6a0: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
c6b0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
c6c0: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
c6d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c6e0: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
c6f0: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
c700: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
c710: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
c720: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c730: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
c740: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
c750: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
c760: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
c770: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
c780: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
c790: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
c7a0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
c7b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
c7c0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
c7d0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
c7e0: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
c7f0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
c800: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
c810: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
c820: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
c830: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c840: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
c850: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
c860: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
c870: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
c880: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
c890: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
c8a0: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
c8b0: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
c8c0: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
c8d0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
c8e0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
c8f0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
c900: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
c910: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
c920: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c930: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
c940: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
c950: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c960: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
c970: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
c980: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
c990: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
c9a0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c9b0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
c9c0: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
c9d0: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
c9e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
c9f0: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
ca00: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
ca10: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
ca20: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
ca30: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
ca40: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
ca50: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
ca60: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
ca70: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
ca80: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
ca90: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
caa0: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
cab0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
cac0: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
cad0: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
cae0: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
caf0: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
cb00: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
cb10: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
cb20: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
cb30: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
cb40: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
cb50: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
cb60: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
cb70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
cb80: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
cb90: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
cba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
cbb0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
cbc0: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
cbd0: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
cbe0: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc00: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
cc10: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
cc20: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
cc30: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc50: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
cc60: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
cc70: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
cc80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
ccb0: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
ccc0: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
ccd0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
cce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ccf0: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
cd00: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
cd10: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
cd20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
cd30: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
cd40: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
cd50: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
cd60: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
cd70: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
cd80: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
cd90: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
cda0: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
cdb0: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
cdc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
cdd0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
cde0: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
cdf0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ce00: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ce10: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
ce20: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
ce30: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
ce40: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
ce50: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
ce60: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
ce70: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
ce80: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
ce90: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
cea0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
ceb0: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
cec0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
ced0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
cee0: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
cef0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
cf00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cf10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cf20: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
cf30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
cf40: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
cf50: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
cf60: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
cf70: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
cf80: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
cf90: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
cfa0: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
cfb0: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
cfc0: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
cfd0: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
cfe0: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
cff0: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d000: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d010: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d020: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d030: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d040: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d050: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d060: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d070: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d080: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d090: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d0a0: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d0b0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d0c0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d0d0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d0e0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d0f0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d100: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d110: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d120: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d130: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d140: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d150: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d170: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d190: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
d1a0: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
d1b0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
d1c0: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
d1d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d1e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
d1f0: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
d200: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
d210: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
d220: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d230: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
d240: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
d250: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
d260: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
d270: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
d280: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
d290: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
d2a0: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
d2b0: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
d2c0: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
d2d0: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
d2e0: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
d2f0: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
d300: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
d310: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
d320: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
d330: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d340: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
d350: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d360: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
d370: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
d380: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
d390: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
d3a0: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
d3b0: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
d3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d3d0: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
d3e0: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
d3f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
d400: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
d410: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
d420: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d430: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d440: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d450: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
d460: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
d470: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
d480: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
d490: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
d4a0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
d4b0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
d4c0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
d4d0: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
d4e0: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
d4f0: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
d500: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
d510: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
d520: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
d530: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
d540: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d550: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
d560: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
d570: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
d580: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
d590: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
d5a0: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
d5b0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
d5c0: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
d5d0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
d5e0: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
d5f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d600: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
d610: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
d620: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
d630: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
d640: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
d650: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
d660: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
d670: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
d680: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
d690: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d6a0: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
d6b0: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
d6c0: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
d6d0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
d6e0: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
d6f0: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
d700: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
d710: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
d720: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
d730: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
d740: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
d750: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
d760: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
d770: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
d780: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
d790: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
d7a0: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
d7b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d7c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d7d0: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
d7e0: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
d7f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
d800: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
d810: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
d820: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
d830: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
d840: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
d850: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
d860: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
d870: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
d880: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
d890: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
d8a0: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
d8b0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
d8c0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
d8d0: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d8f0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
d900: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
d910: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d920: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
d930: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
d940: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
d950: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
d960: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
d970: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
d980: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
d990: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
d9a0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
d9b0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
d9c0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
d9d0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
d9e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
d9f0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
da00: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
da10: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
da20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
da30: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
da40: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
da50: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
da60: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
da70: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
da80: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
da90: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
daa0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
dab0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
dac0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
dad0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
dae0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
daf0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
db00: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
db10: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
db20: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
db30: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
db40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
db50: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
db60: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
db70: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
db80: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
db90: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
dba0: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
dbb0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
dbc0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
dbd0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
dbe0: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
dbf0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
dc00: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
dc10: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
dc20: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
dc30: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
dc40: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d  NCE-OF: R-03640-
dc50: 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66  13415 A value of
dc60: 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   5 means the pag
dc70: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
dc80: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
dc90: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
dca0: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
dcb0: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
dcc0: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
dcd0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dce0: 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76 61  20501-61796 A va
dcf0: 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20  lue of 13 means 
dd00: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
dd10: 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  af.    ** table 
dd20: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
dd30: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
dd40: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
dd50: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
dd60: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
dd70: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
dd80: 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
dd90: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
dda0: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
ddb0: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  .      pPage->no
ddc0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
ddd0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
dde0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
ddf0: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
de00: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
de10: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
de20: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ;.      pPage->n
de30: 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20  oPayload = 1;.  
de40: 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
de50: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
de60: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
de70: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
de80: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
de90: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
dea0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
deb0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
dec0: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
ded0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
dee0: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
def0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
df00: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
df10: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
df20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
df30: 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65  25-53936 A value
df40: 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20   of 2 means the 
df50: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
df60: 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ior.    ** index
df70: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
df80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
df90: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
dfa0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
dfb0: 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31  E-OF: R-16571-11
dfc0: 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31  615 A value of 1
dfd0: 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  0 means the page
dfe0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
dff0: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
e000: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e010: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e020: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e030: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e040: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e050: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e060: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e070: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
e080: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e090: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e0a0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
e0b0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
e0c0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
e0d0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
e0e0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
e0f0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
e100: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e110: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
e120: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
e130: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
e140: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
e150: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
e160: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
e170: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e180: 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  PT;.  }.  pPage-
e190: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
e1a0: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
e1b0: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
e1c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e1d0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
e1e0: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
e1f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
e200: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
e210: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e220: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e230: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
e240: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
e250: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
e260: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
e270: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
e280: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
e290: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
e2a0: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
e2b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
e2c0: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
e2d0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
e2e0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
e2f0: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
e300: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
e310: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
e320: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e330: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
e340: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
e350: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
e360: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e370: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e380: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
e390: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e3a0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e3b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e3c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e3d0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
e3e0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
e3f0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
e400: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
e410: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
e420: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
e430: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e450: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
e460: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
e470: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e480: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
e490: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
e4a0: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
e4b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e4c0: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
e4d0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
e4e0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e500: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
e510: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
e520: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
e530: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
e540: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
e550: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
e560: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
e570: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
e580: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e590: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
e5a0: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
e5b0: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
e5c0: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
e5d0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
e5e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
e5f0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
e600: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
e610: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
e620: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
e630: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e640: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
e650: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
e660: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
e670: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
e680: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
e690: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e6a0: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
e6b0: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
e6c0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
e6d0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
e6e0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
e6f0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
e700: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
e710: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
e720: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
e730: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
e740: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
e750: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
e760: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
e770: 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56  aData;.    /* EV
e780: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
e790: 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
e7a0: 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
e7b0: 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
e7c0: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74  g.    ** the b-t
e7d0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
e7e0: 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  /.    if( decode
e7f0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
e800: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
e810: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e820: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
e830: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
e840: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
e850: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
e860: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
e870: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
e880: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
e890: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
e8a0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
e8b0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
e8c0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
e8d0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
e8e0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
e8f0: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
e900: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
e910: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
e920: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
e930: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
e940: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
e950: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
e960: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
e970: 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
e980: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e990: 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ze];.    /* EVID
e9a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35  ENCE-OF: R-58015
e9b0: 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62  -48175 The two-b
e9c0: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
e9d0: 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74  ffset 5 designat
e9e0: 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  es.    ** the st
e9f0: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
ea00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
ea10: 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
ea20: 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
ea30: 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65     ** interprete
ea40: 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
ea50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ea60: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ea70: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45  dr+5]);.    /* E
ea80: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
ea90: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
eaa0: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
eab0: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
eac0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
ead0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
eae0: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
eaf0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
eb00: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
eb10: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
eb20: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
eb30: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
eb40: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
eb50: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
eb60: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
eb70: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
eb80: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
eb90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
eba0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
ebb0: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
ebc0: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
ebd0: 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  Bt) );.    /* EV
ebe0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
ebf0: 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
ec00: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
ec10: 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
ec20: 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69  nly.    ** possi
ec30: 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
ec40: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
ec50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
ec60: 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
ec70: 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20     ** offset to 
ec80: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec90: 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
eca0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
ecb0: 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  inus the.    ** 
ecc0: 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
ecd0: 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  d space. */.    
ece0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
ecf0: 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
ed00: 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
ed10: 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20  RUPT_DB );..    
ed20: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
ed30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
ed40: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
ed50: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
ed60: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
ed70: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
ed80: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
ed90: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
eda0: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
edb0: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
edc0: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
edd0: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
ede0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
edf0: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
ee00: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
ee10: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
ee20: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
ee30: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
ee40: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
ee50: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ee60: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
ee70: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
ee80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
ee90: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d      if( pBt->db-
eea0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
eeb0: 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
eec0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
eed0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
eee0: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
eef0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
ef00: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
ef10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ef20: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
ef30: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ef40: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
ef50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ef60: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
ef70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
ef80: 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
ef90: 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
efa0: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
efb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
efc0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
efd0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
efe0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f000: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f010: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f020: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f030: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f040: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f050: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61          sz = pPa
f060: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
f070: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
f080: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f090: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
f0a0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
f0b0: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
f0c0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
f0d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f0e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f100: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
f110: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
f120: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20  st++;.    }  .. 
f130: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f140: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
f150: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  ce on the page. 
f160: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
f170: 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
f180: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f190: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f1a0: 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  1 gives the.    
f1b0: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
f1c0: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
f1d0: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
f1e0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
f1f0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66   are no.    ** f
f200: 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
f210: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
f220: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
f230: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
f240: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
f250: 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
f260: 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
f270: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ee space */.    
f280: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
f290: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
f2a0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
f2b0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f2c0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f2d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
f2e0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
f2f0: 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
f300: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
f310: 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
f320: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
f330: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
f340: 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
f350: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
f360: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
f370: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20       ** Or, the 
f380: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66  freeblock is off
f390: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f3a0: 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  page.        */.
f3b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f3c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f3d0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
f3e0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
f3f0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
f400: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
f410: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
f420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
f430: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
f440: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
f450: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
f460: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
f470: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
f480: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
f490: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
f4a0: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
f4b0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
f4c0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
f4d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
f4e0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
f4f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f500: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
f510: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
f520: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
f530: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
f540: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
f550: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
f560: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
f570: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
f580: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
f590: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
f5a0: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
f5b0: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
f5c0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
f5d0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
f5e0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
f5f0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
f600: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
f610: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
f620: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
f630: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
f640: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
f650: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
f660: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
f670: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
f680: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
f690: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
f6a0: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
f6b0: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
f6c0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
f6d0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
f6e0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
f6f0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
f700: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f720: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f730: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
f740: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
f750: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
f760: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
f770: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
f780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f790: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
f7a0: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
f7b0: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
f7c0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
f7d0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
f7e0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
f7f0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
f800: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f810: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
f820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f830: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f840: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
f850: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
f860: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
f870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
f880: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
f890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
f8a0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
f8b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f8c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
f8d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f8e0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
f8f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
f900: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
f910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
f940: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
f950: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
f960: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
f970: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
f980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f9a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
f9b0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
f9c0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
f9d0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
f9e0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
f9f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
fa00: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
fa10: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
fa20: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
fa30: 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
fa40: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
fa50: 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
fa60: 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
fa70: 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
fa80: 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
fa90: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
faa0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fab0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
fac0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
fad0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
fae0: 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
faf0: 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
fb00: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
fb10: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
fb20: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
fb30: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
fb40: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
fb50: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
fb60: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
fb70: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
fb80: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
fb90: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
fba0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
fbb0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
fbc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
fbd0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
fbe0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
fbf0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
fc00: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
fc10: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
fc20: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
fc30: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
fc40: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
fc50: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
fc60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
fc70: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
fc80: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
fc90: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
fca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
fcb0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
fcc0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
fcd0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
fce0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
fcf0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
fd00: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
fd10: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
fd20: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
fd30: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
fd40: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
fd50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
fd60: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
fd70: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
fd80: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
fd90: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
fda0: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
fdb0: 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
fdc0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
fdd0: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
fde0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
fdf0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
fe00: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
fe10: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
fe20: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
fe30: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
fe40: 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
fe50: 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
fe60: 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
fe70: 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
fe80: 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
fe90: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
fea0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
feb0: 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
fec0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
fed0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
fee0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
fef0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
ff00: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
ff10: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
ff20: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
ff30: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
ff40: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
ff50: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
ff60: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
ff70: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
ff80: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
ff90: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
ffa0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
ffb0: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
ffc0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
ffd0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
ffe0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
fff0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10000 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10010 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10020 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10030 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10050 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10060 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10070 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10080 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10090 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
100a0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
100b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
100c0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
100d0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
100e0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
100f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10100 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10110 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
10120 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
10130 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10140 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
10150 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
10160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10170 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10180 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
101a0 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
101b0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
101c0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
101d0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
101e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
101f0 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10200 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10210 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10220 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10230 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10240 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10250 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10260 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10270 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10280 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
10290 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
102a0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
102b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
102c0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
102d0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
102e0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
102f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10300 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10310 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10320 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10330 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10340 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10360 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10370 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10380 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
10390 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
103a0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
103b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
103c0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
103d0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
103e0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
103f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10400 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10410 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10420 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10430 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10440 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10450 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10460 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10470 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10480 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
10490 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
104a0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
104b0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
104c0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
104d0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
104e0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
104f0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10500 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10510 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10520 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10530 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10540 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10550 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10560 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10570 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10580 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10590 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
105a0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
105b0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
105c0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
105d0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
105e0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
105f0 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10600 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10610 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10620 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10630 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10640 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10660 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10670 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10680 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10690 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
106a0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
106b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
106c0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
106d0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
106e0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
106f0 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10700 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10710 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10720 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10730 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10740 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10750 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10770 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10780 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
107b0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
107c0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
107d0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
107e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
107f0 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10800 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10810 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10820 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10830 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10840 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10850 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10880 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10890 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
108a0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
108b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
108c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
108d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
108e0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
108f0 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10900 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10910 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10920 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10930 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10940 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10950 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10960 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10970 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10980 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10990 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
109a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
109b0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
109c0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
109d0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
109e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
109f0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
10a00 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10a10 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
10a20 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
10a30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
10a40 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10a50 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
10a60 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
10a70 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
10a80 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 69 66  pgno, pBt);.  if
10a90 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
10aa0 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
10ab0 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
10ac0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69  (*ppPage);.    i
10ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
10af0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
10b00 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e        goto getAn
10b10 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10b30 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
10b40 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
10b50 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
10b60 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
10b70 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
10b80 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
10b90 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
10ba0 20 20 69 66 28 20 70 43 75 72 0a 20 20 20 26 26    if( pCur.   &&
10bb0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
10bc0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
10bd0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
10be0 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20 20 29 7b  >curIntKey).  ){
10bf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10c00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10c10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
10c20 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
10c30 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
10c40 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
10c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10c60 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
10c70 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
10c80 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  r ) pCur->iPage-
10c90 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  -;.  testcase( p
10ca0 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
10cb0 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
10cc0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
10cd0 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
10ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
10cf0 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
10d00 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
10d10 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
10d20 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
10d30 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
10d40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10d50 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
10d60 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
10d70 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
10d80 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
10d90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
10da0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
10db0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
10dc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10dd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10de0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
10df0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
10e00 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
10e10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
10e20 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
10e30 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
10e40 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
10e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10e60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
10e70 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10e80 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
10e90 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
10ea0 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
10eb0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
10ec0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
10ed0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
10ee0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
10ef0 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pPage);.}../*.
10f00 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
10f10 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
10f20 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
10f30 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
10f40 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
10f50 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
10f60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
10f70 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
10f80 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
10f90 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
10fa0 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
10fb0 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
10fc0 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
10fd0 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
10fe0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
10ff0 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
11000 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
11010 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11020 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11030 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11040 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
11050 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11060 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11070 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
11080 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
11090 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
110a0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
110b0 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
110c0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
110d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
110e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
110f0 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11100 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11110 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
11120 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
11130 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
11140 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
11160 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11170 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
11180 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
11190 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
111a0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
111b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
111c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
111d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
111e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
111f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
11200 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11210 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
11240 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
11250 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
11260 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
11270 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
11280 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
11290 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
112a0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
112b0 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
112c0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
112d0 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
112e0 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
112f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11300 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
11310 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
11320 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
11330 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
11340 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11350 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
11360 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
11370 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
11380 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
11390 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
113a0 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
113b0 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
113c0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
113d0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
113e0 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
113f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11400 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11410 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
11420 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
11430 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11440 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11450 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11460 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
11470 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
11480 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
11490 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
114a0 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
114b0 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
114c0 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
114d0 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
114e0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
114f0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
11500 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
11510 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
11520 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
11530 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
11540 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
11550 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
11560 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
11570 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
11580 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
11590 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
115a0 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
115b0 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
115c0 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
115d0 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
115e0 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
115f0 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
11600 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
11610 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
11620 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
11630 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
11640 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
11650 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11660 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11670 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
11680 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
11690 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
116a0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
116b0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
116c0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
116d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
116e0 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
116f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
11700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11710 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11720 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
11730 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11740 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11750 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
11760 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
11770 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
11780 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
11790 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
117a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
117b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
117c0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
117d0 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
117e0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
117f0 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
11800 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
11810 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
11820 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
11830 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
11840 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
11850 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
11860 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
11870 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
11880 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
11890 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
118a0 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
118b0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
118c0 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
118d0 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
118e0 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
118f0 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
11900 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
11910 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
11920 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
11930 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
11940 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
11950 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
11960 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
11970 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
11980 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
11990 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
119a0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
119b0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
119c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
119d0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
119e0 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
119f0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
11a00 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
11a10 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
11a20 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
11a30 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
11a40 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
11a50 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
11a60 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
11a70 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
11a80 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
11a90 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
11aa0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
11ab0 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
11ac0 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
11ad0 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
11ae0 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
11af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11b00 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
11b10 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
11b20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
11b30 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
11b40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
11b50 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
11b60 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
11b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
11b80 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
11b90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
11bb0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
11bc0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
11bd0 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
11be0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11bf0 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
11c00 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
11c10 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
11c20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11c30 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
11c40 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
11c50 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
11c60 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
11c70 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
11c80 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
11c90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cb0 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
11cc0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
11cd0 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
11d00 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
11d10 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
11d20 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
11d30 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
11d40 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
11d50 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
11d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11d80 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
11d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
11da0 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
11dd0 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
11de0 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
11df0 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
11e00 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
11e10 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
11e20 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
11e30 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
11e40 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
11e50 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
11e60 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
11e70 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
11e80 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
11e90 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
11ea0 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
11eb0 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
11ec0 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
11ed0 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
11ee0 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
11ef0 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
11f00 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
11f10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
11f20 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
11f30 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
11f40 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
11f50 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
11f60 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
11f70 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
11f80 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
11fb0 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
11fc0 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
11ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12000 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
12010 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
12020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
12030 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
12040 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12050 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12060 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
12070 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
12080 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
12090 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
120a0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
120b0 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
120c0 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
120d0 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
120e0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
120f0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
12100 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
12110 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
12120 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
12130 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12140 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
12150 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
12160 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
12170 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
12180 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
12190 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
121a0 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
121b0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
121c0 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
121d0 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
121e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
121f0 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
12200 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
12210 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
12220 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
12230 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12240 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
12250 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
12260 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
12270 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
12280 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
12290 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
122a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
122b0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
122c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
122d0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
122e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
122f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12300 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12310 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12320 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
12330 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12340 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12350 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
12360 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12370 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
12380 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12390 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
123a0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
123b0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
123c0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
123d0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
123e0 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
123f0 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12400 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12410 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12420 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12430 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12440 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12450 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12460 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12470 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12480 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12490 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
124a0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
124b0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
124c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
124d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
124e0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
124f0 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12500 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12510 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12520 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12530 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12540 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12550 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12560 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12570 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12580 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12590 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
125a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
125b0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
125c0 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
125d0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
125e0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
125f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12600 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12610 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12620 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12630 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12640 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12670 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12680 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12690 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
126a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
126b0 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
126c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
126d0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
126e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
126f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12700 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12710 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12720 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12730 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12740 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12750 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12760 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12770 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12780 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12790 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
127a0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
127b0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
127c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
127d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
127e0 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
127f0 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12800 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12810 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12820 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12830 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12850 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12860 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12870 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12880 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12890 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
128a0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
128b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
128c0 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
128d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
128e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
128f0 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
12900 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
12910 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
12920 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
12930 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
12940 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
12950 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
12960 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
12970 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
12980 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
12990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129a0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129b0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
129c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
129d0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
129e0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
129f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12a00 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
12a10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12a20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
12a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
12a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
12a50 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
12a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12a70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12a80 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
12a90 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
12aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
12ab0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12ac0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
12ad0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12ae0 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
12af0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12b00 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12b10 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
12b20 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
12b30 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
12b40 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
12b50 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
12b60 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
12b70 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
12b80 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
12b90 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
12ba0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
12bb0 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
12bc0 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
12bd0 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
12be0 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
12bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
12c00 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
12c10 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
12c20 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
12c30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
12c40 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
12c50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
12c60 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
12c70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
12c80 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
12c90 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
12ca0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
12cb0 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
12cc0 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
12cd0 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
12ce0 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
12cf0 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
12d00 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
12d10 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
12d20 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
12d30 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
12d40 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
12d50 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
12d60 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
12d70 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
12d80 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
12d90 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
12da0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
12db0 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
12dc0 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
12dd0 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
12de0 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
12df0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12e00 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
12e10 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
12e20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
12e30 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12e40 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
12e50 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
12e60 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
12e70 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
12e80 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
12e90 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
12ec0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
12ed0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
12ee0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12f00 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
12f10 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
12f20 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
12f30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12f40 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
12f50 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
12f60 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
12f70 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
12f80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
12f90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12fa0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
12fb0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
12fc0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
12fd0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
12fe0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
12ff0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
13000 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
13010 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
13020 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
13030 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
13040 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
13050 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
13060 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
13070 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
13080 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
13090 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
130a0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
130b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
130c0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
130d0 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
130e0 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
130f0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13100 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
13110 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
13120 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
13130 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
13140 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
13150 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
13160 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
13170 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
13180 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
13190 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
131a0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
131b0 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
131c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
131d0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
131e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
131f0 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
13200 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
13210 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
13220 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
13230 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
13240 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
13250 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
13260 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
13270 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
13280 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
13290 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
132a0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
132b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
132c0 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
132d0 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
132e0 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
132f0 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
13300 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
13310 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
13320 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
13330 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
13340 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
13350 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
13360 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13370 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
13380 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
13390 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
133a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
133b0 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
133c0 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
133d0 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
133e0 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
133f0 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
13400 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13410 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
13420 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
13430 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
13440 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13450 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
13460 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
13470 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
13480 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13490 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
134a0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
134b0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
134c0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
134d0 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
134e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
134f0 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
13500 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13510 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
13520 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
13530 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
13540 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
13550 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
13560 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13570 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
13580 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
13590 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
135a0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
135b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
135c0 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
135d0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
135e0 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
135f0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13600 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13610 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
13620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13630 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
13640 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13650 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13660 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
13670 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
13680 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
13690 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
136a0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
136b0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
136c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
136d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
136e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
136f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
13700 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
13710 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
13720 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13730 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13740 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
13750 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
13760 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
13770 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13780 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
13790 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
137a0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
137b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
137c0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
137d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
137e0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
137f0 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
13800 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
13810 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
13820 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
13830 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
13840 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
13850 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13860 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13870 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13880 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13890 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
138a0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
138b0 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
138c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
138d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
138e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
138f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
13900 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
13910 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13920 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
13930 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
13940 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
13950 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13960 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
13970 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
13980 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
13990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
139a0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
139b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
139c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
139d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
139e0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
139f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13a00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
13a10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13a20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
13a30 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
13a40 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a50 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
13a60 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
13a70 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
13a80 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
13a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13aa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13ab0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
13ac0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
13ad0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13ae0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13af0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13b10 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
13b20 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
13b30 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
13b40 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
13b50 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
13b60 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
13b70 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
13b80 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
13b90 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
13ba0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
13bb0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
13bc0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
13bd0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
13be0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13bf0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
13c00 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
13c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
13c20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
13c30 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
13c40 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
13c50 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
13c60 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
13c70 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
13c80 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
13c90 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
13ca0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
13cb0 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
13cc0 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
13cd0 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
13ce0 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
13cf0 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
13d00 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
13d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13d20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
13d30 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
13d40 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
13d50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
13d60 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
13d70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13d80 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
13d90 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
13da0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
13db0 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
13dc0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
13dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13de0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13df0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
13e00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
13e10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
13e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
13e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
13e40 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
13e50 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
13e60 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
13e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
13e90 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
13ea0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
13eb0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
13ec0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
13ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
13ee0 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
13ef0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
13f00 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
13f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
13f20 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
13f30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
13f40 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
13f50 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
13f60 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
13f70 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
13f80 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
13f90 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
13fa0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
13fb0 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
13fc0 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
13fd0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
13fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
13ff0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
14000 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
14010 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14020 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
14030 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
14040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
14050 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
14060 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
14070 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
14080 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14090 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
140a0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
140b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
140c0 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
140d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
140e0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
140f0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
14100 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
14110 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
14120 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
14130 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
14140 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
14150 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
14160 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
14170 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
14180 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
14190 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
141a0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
141b0 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
141c0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
141d0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
141e0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
141f0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14200 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14210 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
14220 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
14230 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
14240 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
14250 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
14260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14270 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
14280 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
14290 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
142a0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
142b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
142c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
142d0 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
142e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
142f0 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
14300 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
14310 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
14320 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
14330 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14340 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14350 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
14360 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14370 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14380 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
14390 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
143a0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
143b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
143c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
143d0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
143e0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
143f0 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
14400 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
14410 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
14420 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14430 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
14440 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
14450 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
14460 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14480 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14490 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
144a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
144b0 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
144c0 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
144d0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
144e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
144f0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
14500 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
14510 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
14520 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
14530 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
14540 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
14550 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
14560 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
14570 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
14580 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
14590 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
145a0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
145b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
145c0 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
145d0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
145e0 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
145f0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
14600 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
14610 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
14620 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
14630 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
14640 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
14650 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
14660 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
14670 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
14680 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
14690 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
146a0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
146b0 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
146c0 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
146d0 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
146e0 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
146f0 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
14700 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
14710 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
14720 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
14730 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
14740 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
14750 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
14760 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
14770 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
14780 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
14790 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
147a0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
147b0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
147c0 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
147d0 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
147e0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
147f0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
14800 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
14810 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
14820 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
14830 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
14840 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
14850 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
14860 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
14870 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
14880 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
14890 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
148a0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
148b0 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
148c0 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
148d0 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
148e0 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
148f0 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
14900 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
14910 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
14920 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
14930 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
14940 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
14950 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
14960 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
14970 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
14980 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14990 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
149a0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
149b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
149c0 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
149d0 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
149e0 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
149f0 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
14a00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
14a10 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
14a20 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
14a30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
14a40 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
14a50 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
14a60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14a70 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
14a80 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
14a90 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
14aa0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
14ab0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
14ac0 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
14ad0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
14ae0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
14af0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
14b00 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
14b10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14b20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
14b30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14b40 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
14b50 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
14b60 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
14b70 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
14b80 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
14b90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14ba0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
14bb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
14bc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
14bd0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
14be0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
14bf0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
14c00 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
14c10 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
14c20 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
14c30 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
14c40 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
14c60 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
14c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
14c80 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
14c90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
14ca0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
14cb0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
14cc0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
14cd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
14ce0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
14cf0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
14d00 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
14d10 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
14d20 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
14d30 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
14d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
14d50 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
14d60 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
14d70 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
14d80 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
14d90 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
14da0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
14db0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
14dc0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
14dd0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
14de0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
14df0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
14e00 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
14e10 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
14e20 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
14e30 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
14e40 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
14e50 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
14e60 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
14e70 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
14e80 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
14e90 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
14ea0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
14eb0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
14ec0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
14ed0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
14ee0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
14ef0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
14f00 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
14f10 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
14f20 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
14f30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
14f40 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
14f50 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14f60 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
14f70 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
14f80 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
14f90 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
14fa0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
14fb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14fc0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
14fd0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
14fe0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
14ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
15000 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15020 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
15030 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15040 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15050 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15060 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
15070 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
15080 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
15090 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
150a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
150b0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
150c0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
150d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
150e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
150f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
15100 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15110 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
15120 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
15130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
15140 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
15150 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
15160 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
15170 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
15180 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
15190 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
151a0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
151b0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
151c0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
151d0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
151e0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
151f0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
15200 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
15210 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
15220 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
15230 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
15240 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
15250 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
15260 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
15270 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
15280 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
15290 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
152a0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
152b0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
152c0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
152d0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
152e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
152f0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
15300 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
15310 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
15320 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
15330 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
15340 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
15350 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
15360 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
15370 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
15380 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
15390 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
153a0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
153b0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
153c0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
153d0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
153e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
153f0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15410 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15440 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
15450 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
15460 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
15470 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15480 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
154a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
154b0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
154c0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
154d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
154e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
154f0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
15500 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
15510 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15520 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
15530 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
15540 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
15550 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15560 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
15570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15580 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15590 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
155a0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
155b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
155c0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
155d0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
155e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
155f0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
15610 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
15620 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
15630 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
15640 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
15650 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
15660 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
15670 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
15680 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
15690 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
156a0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
156b0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
156c0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
156d0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
156e0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
156f0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
15700 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
15710 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
15720 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15730 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
15740 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
15750 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
15760 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
15770 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
15780 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
15790 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
157a0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
157b0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
157c0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
157d0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
157e0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
157f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15800 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
15810 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
15820 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
15830 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
15840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15850 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
15860 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
15870 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
15880 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
15890 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
158a0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
158b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
158c0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
158d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
158e0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
158f0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15900 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15910 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
15920 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
15930 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
15940 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15950 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15960 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15970 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
15980 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
15990 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
159a0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
159b0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
159c0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
159d0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
159e0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
159f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
15a00 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
15a10 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
15a20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15a30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15a40 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
15a50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15a60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15a70 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
15a80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15a90 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
15aa0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
15ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15ac0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
15ad0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
15ae0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15b00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15b10 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
15b20 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
15b30 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
15b40 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
15b50 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
15b60 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
15b70 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
15b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
15b90 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
15ba0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
15bb0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
15bc0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
15bd0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
15be0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
15bf0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
15c00 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
15c10 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
15c20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
15c30 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
15c40 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
15c50 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
15c60 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
15c70 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
15c80 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
15c90 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
15ca0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
15cb0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
15cc0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
15cd0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
15ce0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
15cf0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
15d00 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
15d10 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
15d20 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
15d30 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
15d40 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
15d50 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
15d60 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
15d70 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
15d80 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
15d90 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
15da0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
15db0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
15dc0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
15dd0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
15de0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
15df0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
15e00 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
15e10 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
15e20 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
15e30 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
15e40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15e50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
15e60 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
15e70 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
15e80 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
15e90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ea0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15eb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15ec0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
15ed0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
15ee0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
15ef0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
15f00 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
15f10 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
15f20 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
15f30 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
15f40 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
15f50 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
15f60 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
15f70 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
15f80 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
15f90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15fa0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
15fb0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
15fc0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
15fd0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
15fe0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
15ff0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
16000 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
16010 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
16020 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
16030 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
16040 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
16050 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
16060 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
16070 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
16080 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
16090 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
160a0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
160b0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
160c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
160d0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
160e0 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
160f0 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
16100 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
16110 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
16120 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
16130 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16140 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
16150 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
16160 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
16170 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
16180 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
16190 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
161a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
161b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
161c0 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
161d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
161e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
161f0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
16200 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
16210 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
16220 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
16230 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
16240 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
16250 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
16260 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16270 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
16280 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
16290 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
162a0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
162b0 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
162c0 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
162d0 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
162e0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
162f0 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
16300 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
16310 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
16320 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
16330 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
16340 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
16350 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
16360 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
16370 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
16380 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
16390 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
163a0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
163b0 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
163c0 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
163d0 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
163e0 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
163f0 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
16400 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
16410 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
16420 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
16430 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
16440 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
16450 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
16460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16470 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16480 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
16490 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
164a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
164b0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
164c0 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
164d0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
164e0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
164f0 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
16500 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16510 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16520 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
16530 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
16540 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
16550 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
16560 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
16570 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
16580 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
16590 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
165a0 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
165b0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
165c0 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
165d0 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
165e0 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
165f0 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
16600 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
16610 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
16620 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
16630 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
16640 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
16650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16660 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
16670 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
16680 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
16690 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
166a0 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
166b0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
166c0 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
166d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
166e0 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
166f0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
16700 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
16710 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
16720 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
16730 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16740 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
16750 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
16760 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
16770 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
16780 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
16790 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
167a0 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
167b0 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
167c0 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
167d0 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
167e0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
167f0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
16800 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
16810 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
16820 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
16830 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
16840 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16850 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16860 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
16870 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
16880 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
16890 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
168a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
168b0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
168c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
168d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
168e0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
168f0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
16900 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
16910 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
16920 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
16930 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
16940 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
16950 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
16960 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
16970 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
16980 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
16990 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
169a0 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
169b0 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
169c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
169d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
169e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
169f0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
16a00 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
16a10 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
16a20 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
16a30 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
16a40 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16a50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
16a60 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
16a70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16a80 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16a90 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
16aa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ab0 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a  return b;.}../*.
16ac0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
16ad0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
16ae0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
16af0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
16b00 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
16b10 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
16b20 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
16b30 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
16b40 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
16b50 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
16b60 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
16b70 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
16b80 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
16b90 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
16ba0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
16bb0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
16bc0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
16bd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16be0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
16bf0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
16c00 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
16c10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
16c20 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
16c30 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
16c40 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
16c50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16c70 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
16c80 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
16c90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16ca0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
16cb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16cc0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16cd0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
16ce0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
16cf0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
16d00 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
16d20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
16d30 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
16d40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
16d50 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
16d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16d70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16d80 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
16d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
16da0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
16db0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
16dc0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
16dd0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
16de0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
16df0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
16e00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16e10 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
16e20 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
16e30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
16e40 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
16e50 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
16e60 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
16e70 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
16e80 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16e90 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
16ea0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
16eb0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
16ec0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
16ed0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
16ee0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
16ef0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
16f00 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
16f10 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
16f20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16f30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
16f40 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
16f50 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
16f60 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
16f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16f80 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
16f90 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
16fa0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
16fb0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
16fc0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
16fd0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
16fe0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
16ff0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
17000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17010 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
17020 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
17030 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
17040 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
17050 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
17060 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
17070 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
17080 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
17090 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
170a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
170b0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
170c0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
170e0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
170f0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
17100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17110 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
17120 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
17130 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17140 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
17150 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17160 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17170 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
17180 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
17190 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
171a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
171b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
171c0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
171d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
171e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
171f0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
17200 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
17210 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17220 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
17240 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
17250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17260 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
17270 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
17280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
172a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
172b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
172c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
172d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
172e0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
172f0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
17300 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
17310 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
17320 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
17330 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
17340 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
17350 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
17360 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
17370 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
17380 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
17390 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
173a0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
173b0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
173c0 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
173d0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
173e0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
173f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
17400 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
17410 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
17420 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
17430 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
17440 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
17450 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
17460 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
17470 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
17480 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
17490 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
174a0 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
174b0 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
174c0 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
174d0 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
174e0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
174f0 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
17500 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
17510 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
17520 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
17530 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
17540 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
17550 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
17560 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
17570 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17580 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17590 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
175a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
175b0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
175c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
175d0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
175e0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
175f0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
17600 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
17610 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17620 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
17630 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
17640 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
17650 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17660 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
17670 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
17680 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
17690 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
176a0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
176b0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
176c0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
176d0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
176e0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
176f0 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
17700 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
17710 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
17720 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
17730 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
17740 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
17750 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
17760 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
17770 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
17780 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
17790 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
177a0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
177b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
177c0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
177d0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
177e0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
177f0 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
17800 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
17810 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
17820 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
17830 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
17840 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
17850 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
17860 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
17870 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
17880 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
17890 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
178a0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
178b0 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
178c0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
178d0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
178e0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
178f0 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
17900 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17910 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
17920 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17930 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
17940 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
17950 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17960 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
17970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
17990 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
179a0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a  E_NOTADB;.    }.
179b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
179c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
179d0 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
179e0 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
179f0 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
17a00 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
17a10 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
17a20 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
17a30 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
17a40 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
17a50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17a60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
17a70 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
17a80 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
17a90 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
17aa0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
17ab0 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
17ac0 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
17ad0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
17ae0 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
17af0 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
17b00 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
17b10 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17b20 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
17b30 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17b40 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
17b50 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
17b60 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
17b70 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
17b80 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
17b90 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
17ba0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
17bb0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
17bc0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
17bd0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
17be0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
17bf0 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
17c00 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
17c10 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
17c20 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
17c30 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
17c40 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
17c50 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
17c60 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
17c70 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
17c80 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
17c90 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
17ca0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
17cb0 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
17cc0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
17cd0 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
17ce0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
17cf0 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
17d00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17d10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
17d20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17d30 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17d40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17d50 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30  OF: R-59310-5120
17d60 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20  5 The "reserved 
17d70 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74  space" size in t
17d80 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a  he 1-byte.    **
17d90 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
17da0 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d  et 20 is the num
17db0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17dc0 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
17dd0 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20   of.    ** each 
17de0 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20  page to reserve 
17df0 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20  for extensions. 
17e00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
17e10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
17e20 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
17e30 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
17e40 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
17e50 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
17e60 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
17e70 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
17e80 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
17e90 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20  et of 20.    ** 
17ea0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
17eb0 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a  e file header. *
17ec0 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  /.    usableSize
17ed0 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
17ee0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
17ef0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
17f00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
17f10 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
17f20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
17f30 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
17f40 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
17f50 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
17f60 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
17f70 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
17f80 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
17f90 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
17fa0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
17fb0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
17fc0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
17fd0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
17fe0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
17ff0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
18000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
18010 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
18020 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
18030 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18040 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
18050 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
18060 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
18070 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18080 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
18090 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
180a0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
180b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
180c0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
180d0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
180e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
180f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
18100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
18110 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
18150 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
18160 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18170 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
18180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
18190 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
181a0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
181b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
181c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
181d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
181e0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
181f0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
18200 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18210 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65  28312-64704 Howe
18220 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20  ver, the usable 
18230 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  size is not allo
18240 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  wed to.    ** be
18250 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20   less than 480. 
18260 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18270 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
18280 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68   is 512, then th
18290 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65  e.    ** reserve
182a0 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e  d space size can
182b0 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a  not exceed 32. *
182c0 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  /.    if( usable
182d0 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
182e0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
182f0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18300 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18310 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18320 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
18330 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
18340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18350 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
18360 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
18370 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
18380 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
18390 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
183a0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
183b0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
183c0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
183d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
183e0 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
183f0 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
18400 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
18410 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
18420 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
18430 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
18440 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
18450 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
18460 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
18470 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
18480 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
18490 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
184a0 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
184b0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
184c0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
184d0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
184e0 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
184f0 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
18500 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
18510 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
18520 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
18530 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
18540 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
18550 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
18560 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
18570 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
18580 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
18590 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
185a0 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
185b0 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
185c0 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
185d0 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
185e0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
185f0 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
18600 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
18610 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
18620 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
18630 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
18640 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
18650 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
18660 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
18670 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18680 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18690 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
186a0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
186b0 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
186c0 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
186d0 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
186e0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
186f0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
18700 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
18710 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
18720 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18730 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
18740 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18750 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
18760 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
18770 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
18780 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
18790 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
187a0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
187b0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
187c0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
187d0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
187e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
187f0 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
18800 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
18810 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
18820 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
18830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18840 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18860 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
18870 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
18880 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
18890 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
188a0 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
188b0 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
188c0 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
188d0 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
188e0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
188f0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
18900 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
18910 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
18920 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
18930 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
18940 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
18950 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
18960 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
18970 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
18980 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
18990 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
189a0 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
189b0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
189c0 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
189d0 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
189e0 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
189f0 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
18a00 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
18a10 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
18a20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
18a30 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
18a40 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
18a50 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
18a60 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
18a70 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
18a80 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
18a90 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
18aa0 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
18ab0 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
18ac0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
18ad0 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
18ae0 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
18af0 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
18b00 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
18b10 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
18b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
18b30 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
18b40 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
18b50 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
18b60 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
18b70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
18b80 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
18b90 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
18ba0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
18bb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
18bc0 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
18bd0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
18be0 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
18bf0 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
18c00 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
18c10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
18c20 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
18c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
18c40 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
18c50 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
18c60 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
18c70 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
18c80 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
18c90 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
18ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18cb0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
18cd0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
18ce0 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
18cf0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
18d00 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
18d10 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
18d20 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
18d30 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
18d40 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
18d50 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
18d60 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
18d70 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
18d80 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
18d90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
18da0 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
18db0 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
18dc0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
18dd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
18de0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a  otNull(pPage1);.
18df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
18e00 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
18e10 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
18e20 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
18e30 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
18e40 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
18e50 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
18e60 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
18e70 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
18e80 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
18e90 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
18ea0 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
18eb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18ec0 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
18ed0 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
18ee0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
18ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18f00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18f10 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
18f20 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
18f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18f40 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
18f50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
18f60 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
18f70 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
18f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18f90 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
18fa0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
18fb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
18fc0 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
18fd0 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
18fe0 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
18ff0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
19000 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
19010 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
19020 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19030 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
19040 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
19050 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
19060 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
19070 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
19080 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
19090 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
190a0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
190b0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
190c0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
190d0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
190e0 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
190f0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
19100 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
19110 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
19120 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
19130 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
19140 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
19150 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
19160 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
19170 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
19180 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
19190 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
191a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
191b0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
191c0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
191d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
191e0 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
191f0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
19200 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
19210 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
19220 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
19230 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
19240 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
19250 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
19260 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
19270 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
19280 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19290 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
192a0 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
192b0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
192c0 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
192d0 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
192e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
192f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
19300 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
19320 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
19330 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
19340 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
19350 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
19360 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
19370 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
19380 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
19390 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
193a0 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
193b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
193c0 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
193d0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
193e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
193f0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
19400 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
19410 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
19420 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
19430 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
19440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19450 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19460 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
19470 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
19480 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
19490 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
194a0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
194b0 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
194c0 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
194d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
194e0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
194f0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
19500 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
19510 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
19520 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
19530 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
19540 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
19550 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
19560 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
19570 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
19580 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
19590 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
195a0 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
195b0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
195c0 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
195d0 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
195e0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
195f0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
19600 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19610 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
19620 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
19630 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
19640 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
19650 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
19660 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19670 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
19680 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
19690 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
196a0 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
196b0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
196c0 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
196d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
196e0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
196f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19700 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
19710 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19720 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
19730 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19740 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
19750 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19760 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
19770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
19780 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
19790 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
197a0 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
197b0 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
197c0 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
197d0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
197e0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
197f0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
19800 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
19810 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
19820 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
19830 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
19840 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
19850 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
19860 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
19870 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
19880 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
19890 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
198a0 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
198b0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
198c0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
198d0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
198e0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
198f0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
19900 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
19910 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
19920 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
19930 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
19940 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
19950 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
19960 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
19970 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
19980 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
19990 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
199a0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
199b0 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
199c0 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
199d0 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
199e0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
199f0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
19a00 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
19a10 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
19a20 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
19a30 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
19a40 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
19a50 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
19a60 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
19a70 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
19a80 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
19a90 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
19aa0 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
19ab0 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
19ac0 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
19ad0 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
19ae0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
19af0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
19b00 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
19b10 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
19b20 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
19b30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
19b40 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
19b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19b60 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
19b70 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
19b80 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
19b90 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
19ba0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
19bb0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
19bc0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
19bd0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
19be0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
19bf0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
19c00 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
19c10 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
19c20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
19c30 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
19c40 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
19c50 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
19c60 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
19c70 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
19c80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19c90 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
19ca0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
19cb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
19cc0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
19cd0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
19ce0 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
19cf0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
19d00 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
19d10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
19d20 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
19d30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19d40 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
19d50 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
19d60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
19d70 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
19d80 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
19d90 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19da0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
19db0 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
19dc0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
19dd0 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
19de0 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
19df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
19e00 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
19e10 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
19e20 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
19e30 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
19e40 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
19e50 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
19e60 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
19e70 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
19e80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19e90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
19ea0 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
19eb0 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
19ec0 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
19ed0 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
19ee0 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
19ef0 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
19f00 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
19f10 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
19f20 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
19f30 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
19f40 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
19f50 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
19f60 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
19f70 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
19f80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
19f90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19fa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19fb0 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
19fc0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
19fd0 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
19fe0 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
19ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1a000 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1a010 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1a020 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
1a030 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1a040 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1a050 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1a060 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1a070 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1a080 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1a090 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1a0a0 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1a0b0 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1a0c0 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1a0d0 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1a0e0 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1a0f0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1a100 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1a110 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1a120 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1a130 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1a140 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1a150 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1a160 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1a170 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1a180 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1a190 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1a1a0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a1b0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1a1c0 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1a1d0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1a1e0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1a1f0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1a200 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1a210 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1a220 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1a230 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1a240 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1a250 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1a260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1a270 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1a280 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1a290 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1a2a0 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1a2b0 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1a2c0 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1a2d0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1a2e0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1a2f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1a300 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1a310 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1a320 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1a330 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1a340 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1a350 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1a360 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1a370 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1a380 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1a390 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1a3a0 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1a3b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a3c0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1a3d0 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1a3e0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1a3f0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1a400 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a410 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1a420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1a430 74 20 62 53 75 62 6a 49 6e 4d 65 6d 20 3d 20 73  t bSubjInMem = s
1a440 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
1a450 72 79 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ry(p->db);.     
1a460 20 20 20 69 6e 74 20 65 78 46 6c 61 67 20 3d 20     int exFlag = 
1a470 70 2d 3e 64 62 2d 3e 62 55 6e 6c 6f 63 6b 65 64  p->db->bUnlocked
1a480 20 3f 20 2d 31 20 3a 20 28 77 72 66 6c 61 67 3e   ? -1 : (wrflag>
1a490 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1);.        asse
1a4a0 72 74 28 20 70 2d 3e 64 62 2d 3e 62 55 6e 6c 6f  rt( p->db->bUnlo
1a4b0 63 6b 65 64 3d 3d 30 20 7c 7c 20 77 72 66 6c 61  cked==0 || wrfla
1a4c0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  g==1 );.        
1a4d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a4e0 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
1a4f0 65 72 2c 20 65 78 46 6c 61 67 2c 20 62 53 75 62  er, exFlag, bSub
1a500 6a 49 6e 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  jInMem);.       
1a510 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a530 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1a540 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
1a550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a560 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
1a570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a580 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1a590 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
1a5a0 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
1a5b0 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
1a5c0 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
1a5d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1a5e0 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
1a5f0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
1a600 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
1a610 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a630 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a640 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1a650 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1a660 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
1a670 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1a680 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
1a690 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1a6a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1a6b0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
1a6c0 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
1a6d0 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
1a6e0 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
1a6f0 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
1a700 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
1a710 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
1a720 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
1a730 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
1a740 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1a750 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
1a760 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
1a770 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
1a780 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
1a790 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
1a7a0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1a7b0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1a7c0 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
1a7d0 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
1a7e0 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
1a7f0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1a800 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1a810 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1a820 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a830 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
1a840 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
1a850 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
1a860 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
1a870 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1a880 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
1a890 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
1a8a0 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
1a8b0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
1a8c0 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
1a8d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
1a8e0 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
1a8f0 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
1a900 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
1a910 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
1a920 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
1a930 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
1a940 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
1a950 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
1a960 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
1a970 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
1a980 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
1a990 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1a9a0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
1a9b0 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
1a9c0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1a9d0 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
1a9e0 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
1a9f0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
1aa00 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
1aa10 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
1aa20 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1aa30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1aa40 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
1aa50 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1aa60 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
1aa70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1aa80 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1aa90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1aaa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aac0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1aad0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1aae0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ab00 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
1ab10 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
1ab20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1ab30 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
1ab40 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
1ab50 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
1ab60 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
1ab70 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
1ab80 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1ab90 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1aba0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1abb0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1abc0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
1abd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1abe0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1abf0 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1ac00 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1ac10 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1ac20 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1ac30 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1ac40 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
1ac50 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
1ac60 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1ac70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1ac80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1ac90 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1aca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1acb0 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1acc0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1acd0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1ace0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1acf0 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1ad00 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1ad10 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1ad20 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1ad30 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1ad40 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1ad50 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1ad60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1ad70 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1ad80 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1ad90 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1ada0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1adb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1add0 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1ade0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1adf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ae00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ae10 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1ae20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1ae30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ae60 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1ae70 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1ae80 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
1ae90 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1aea0 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
1aeb0 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1aec0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1aed0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1aee0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1aef0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
1af00 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1af10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1af20 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1af30 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1af40 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
1af50 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1af60 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1af70 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1af80 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1af90 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1afa0 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1afb0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1afc0 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1afd0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1afe0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1aff0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1b000 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1b010 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1b020 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1b030 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1b040 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1b050 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1b060 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1b070 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1b080 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1b090 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1b0a0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1b0b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1b0c0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1b0d0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1b0e0 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
1b0f0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
1b100 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1b110 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
1b120 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b130 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
1b140 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
1b150 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
1b160 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
1b170 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
1b180 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
1b190 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
1b1a0 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
1b1b0 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
1b1c0 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
1b1d0 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
1b1e0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
1b1f0 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
1b200 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1b210 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1b220 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
1b230 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b240 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
1b250 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1b260 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
1b270 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1b280 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1b290 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
1b2a0 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
1b2b0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
1b2c0 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
1b2d0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
1b2e0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1b2f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
1b300 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1b310 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
1b320 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1b330 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
1b350 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1b360 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
1b370 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
1b380 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
1b390 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
1b3a0 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
1b3b0 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
1b3c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b3d0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1b3e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1b3f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1b400 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
1b410 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
1b420 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
1b430 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1b440 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
1b450 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
1b460 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1b470 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
1b480 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
1b490 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1b4a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
1b4b0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
1b4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1b4d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1b4e0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1b4f0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1b500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
1b510 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1b520 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1b530 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1b540 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1b550 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74  rc;..    rc = bt
1b560 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1b570 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1b580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b590 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1b5a0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
1b5b0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1b5c0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
1b5d0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b5e0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
1b5f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1b600 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
1b610 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
1b620 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61  nfo;.        pPa
1b630 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
1b640 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1b650 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
1b660 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a   info.iOverflow.
1b670 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
1b680 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
1b690 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +3<=pPage->aData
1b6a0 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
1b6b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72  .         && iFr
1b6c0 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
1b6d0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1b6e0 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow]).        ){.
1b6f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1b700 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1b710 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
1b720 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b730 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b750 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1b760 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1b770 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1b780 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1b790 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b7a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b7b0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1b7c0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1b7d0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1b7e0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1b7f0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1b800 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1b810 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1b820 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1b830 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1b840 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b850 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
1b860 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1b870 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1b880 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
1b890 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
1b8a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1b8b0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
1b8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8d0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1b8e0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1b8f0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1b900 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1b910 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1b920 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1b930 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1b940 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1b950 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1b960 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1b970 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1b980 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1b990 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1b9a0 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1b9b0 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1b9c0 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1b9d0 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1b9e0 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1b9f0 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1ba00 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1ba10 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1ba20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1ba30 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1ba40 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1ba50 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1ba60 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1ba70 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1ba80 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1ba90 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1baa0 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1bab0 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1bac0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1bad0 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1bae0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1baf0 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1bb00 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1bb10 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1bb20 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1bb30 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1bb40 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1bb50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1bb60 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1bb70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1bb80 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1bb90 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1bba0 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1bbb0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1bbc0 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1bbd0 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1bbe0 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1bbf0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1bc00 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1bc10 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1bc20 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1bc30 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1bc40 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1bc50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1bc60 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1bc70 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1bc80 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1bc90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1bca0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1bcb0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1bcc0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1bcd0 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1bce0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1bcf0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1bd00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1bd10 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1bd20 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1bd30 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1bd40 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1bd50 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1bd60 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1bd70 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1bd80 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1bd90 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1bda0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1bdb0 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1bdc0 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1bdd0 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1bde0 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1bdf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1be00 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1be10 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1be20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1be30 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1be40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1be50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1be60 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1be70 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1be80 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1be90 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1bea0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1beb0 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1bec0 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1bed0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1bee0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1bef0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1bf00 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1bf10 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1bf20 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1bf30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1bf40 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1bf50 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1bf60 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1bf70 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1bf80 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1bf90 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1bfa0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1bfb0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1bfc0 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1bfd0 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1bfe0 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1bff0 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1c000 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1c010 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1c020 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1c030 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1c040 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c050 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1c060 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1c070 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c090 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c0a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1c0b0 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1c0c0 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1c0d0 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1c0e0 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1c0f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1c100 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1c110 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1c120 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1c130 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c140 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c160 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c170 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1c180 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1c190 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1c1a0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1c1b0 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1c1c0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1c1d0 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1c1e0 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1c1f0 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1c200 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1c210 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1c220 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c230 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1c240 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1c250 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1c260 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1c270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c280 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c290 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1c2a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c2b0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1c2c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1c2d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c2e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c2f0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1c300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c310 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1c320 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1c330 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1c340 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1c350 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1c360 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1c370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1c390 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1c3a0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1c3b0 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1c3c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c3d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1c3e0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1c3f0 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1c400 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1c410 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1c420 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1c430 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1c440 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1c450 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1c460 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1c470 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1c480 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1c490 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1c4a0 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1c4b0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1c4c0 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1c4d0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1c4e0 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1c4f0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1c500 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1c510 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1c520 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1c530 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1c540 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1c550 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1c560 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1c570 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c580 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1c590 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1c5a0 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1c5b0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1c5c0 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1c5d0 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1c5e0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1c5f0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1c600 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1c610 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1c620 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1c630 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1c640 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1c650 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1c660 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1c670 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1c680 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1c690 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1c6a0 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1c6b0 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1c6c0 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1c6d0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1c6e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1c6f0 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1c700 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1c710 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1c720 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1c730 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1c740 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1c750 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1c760 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1c770 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1c780 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1c790 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1c7a0 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1c7b0 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1c7c0 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1c7d0 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1c7e0 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1c7f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c800 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1c810 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1c820 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1c830 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1c840 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1c850 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1c860 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1c870 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1c880 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1c890 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1c8a0 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1c8b0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1c8c0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1c8d0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1c8e0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1c8f0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1c900 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1c910 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1c920 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1c930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1c940 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1c950 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1c960 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1c970 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1c980 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c9a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c9b0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1c9c0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c9d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c9e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1c9f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1ca00 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1ca10 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1ca20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1ca30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1ca40 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1ca50 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1ca60 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1ca70 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1ca80 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1ca90 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1caa0 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1cab0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1cac0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1cad0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1cae0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1caf0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1cb00 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1cb10 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1cb20 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1cb30 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1cb40 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1cb50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1cb60 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1cb70 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1cb80 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1cb90 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1cba0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1cbb0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1cbc0 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1cbd0 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1cbe0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cbf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1cc00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1cc10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1cc20 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1cc30 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1cc40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1cc50 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1cc60 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1cc70 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1cc90 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1cca0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1ccb0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1ccc0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1ccd0 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1cce0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1ccf0 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1cd00 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1cd10 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1cd20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1cd30 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1cd40 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1cd50 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1cd60 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1cd70 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1cd80 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1cd90 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1cda0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1cdb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cdc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1cdd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1cde0 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1cdf0 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1ce00 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1ce10 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1ce20 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1ce30 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1ce40 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1ce50 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1ce60 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1ce70 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1ce80 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1ce90 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1cea0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1ceb0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1cec0 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1ced0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1cee0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1cef0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1cf00 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1cf10 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1cf20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1cf30 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1cf40 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1cf50 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1cf60 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1cf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cf80 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1cf90 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1cfa0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1cfb0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1cfc0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1cfd0 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1cfe0 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1cff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1d010 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1d020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1d030 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d040 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1d050 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d060 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1d070 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1d080 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1d090 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1d0a0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1d0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1d0c0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1d0d0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1d0e0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1d0f0 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1d100 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1d110 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1d120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d130 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d140 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d150 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1d160 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1d170 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1d180 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1d190 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1d1a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1d1b0 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1d1c0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1d1d0 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1d1e0 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1d1f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1d200 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1d210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d220 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1d230 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1d240 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1d250 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1d260 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1d270 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1d280 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1d290 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1d2a0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1d2b0 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1d2c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d2d0 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1d2e0 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1d2f0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1d300 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1d310 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1d320 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1d330 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1d340 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1d350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d360 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1d370 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1d380 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1d390 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3b0 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1d3c0 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1d3d0 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1d3e0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1d3f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d400 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1d410 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1d420 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1d430 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1d440 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1d450 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1d460 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1d470 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1d480 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1d490 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1d4a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d4b0 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1d4c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1d4d0 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1d4e0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1d4f0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d500 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1d510 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1d520 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1d530 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1d540 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1d550 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1d560 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1d570 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1d580 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1d590 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1d5a0 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1d5b0 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1d5c0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1d5d0 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1d5e0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1d5f0 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1d600 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1d610 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1d620 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1d630 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1d640 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1d650 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1d660 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1d670 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d680 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1d690 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1d6a0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1d6b0 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1d6c0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1d6d0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1d6e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d6f0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1d700 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1d710 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1d720 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d730 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1d740 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d750 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1d760 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1d770 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1d780 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1d790 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1d7a0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1d7b0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1d7c0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1d7d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d7e0 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1d7f0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1d800 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1d810 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1d820 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1d830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d840 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d850 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1d860 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1d870 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1d880 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1d890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d8a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d8b0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1d8c0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1d8d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1d8e0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1d8f0 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1d900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1d930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1d940 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1d950 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1d960 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1d970 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d980 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1d990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d9a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d9b0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d9c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1d9d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1d9e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d9f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1da00 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1da10 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1da20 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1da30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1da40 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1da50 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1da60 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1da70 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1da80 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1da90 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1daa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1dab0 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1dac0 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1dad0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1dae0 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1daf0 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1db00 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1db10 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1db20 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1db30 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1db40 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1db50 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1db60 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1db70 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1db80 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1db90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dba0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1dbb0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1dbc0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1dbd0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1dbe0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1dbf0 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
1dc00 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1dc10 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1dc20 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1dc30 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1dc40 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1dc50 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1dc60 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1dc70 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1dc80 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1dc90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dca0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1dcb0 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1dcc0 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1dcd0 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1dce0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1dcf0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1dd00 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1dd10 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1dd20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1dd30 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1dd40 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1dd50 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1dd60 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1dd70 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1dd80 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1dd90 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1dda0 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1ddb0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1ddc0 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1ddd0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1dde0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1ddf0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1de00 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1de10 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1de20 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1de30 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1de40 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1de50 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1de60 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1de70 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1de80 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1de90 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1dea0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1deb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1dec0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ded0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1dee0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1def0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1df00 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1df10 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1df20 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1df30 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1df40 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1df50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1df60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1df70 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1df80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1df90 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1dfa0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1dfb0 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1dfc0 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1dfd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1dfe0 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1dff0 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1e000 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1e010 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1e020 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1e030 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1e040 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1e050 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1e060 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e070 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1e080 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e090 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1e0a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1e0b0 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1e0c0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e0d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1e0e0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1e0f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e100 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1e110 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1e120 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1e130 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1e140 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1e150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e160 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e170 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1e180 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1e190 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e1a0 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1e1b0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1e1c0 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1e1d0 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1e1e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e1f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1e200 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1e210 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1e220 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1e230 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e240 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1e250 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1e260 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1e270 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1e280 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1e290 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1e2a0 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1e2b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1e2c0 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1e2d0 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1e2e0 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1e2f0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1e300 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1e310 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1e320 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1e330 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1e340 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1e350 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1e360 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1e370 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1e380 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1e390 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1e3a0 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1e3b0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1e3c0 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1e3d0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1e3e0 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1e3f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1e400 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1e410 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1e420 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1e430 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1e440 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e450 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1e460 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1e470 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1e480 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1e490 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1e4a0 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1e4b0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1e4c0 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1e4d0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1e4e0 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1e4f0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1e500 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1e510 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1e520 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1e530 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1e540 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1e550 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1e560 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1e570 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1e580 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1e590 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1e5a0 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1e5b0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1e5c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1e5d0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1e5e0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1e5f0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1e600 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1e610 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1e620 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1e630 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1e640 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1e650 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1e660 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1e670 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1e680 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1e690 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1e6a0 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1e6b0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1e6c0 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1e6d0 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1e6e0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1e6f0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1e700 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1e710 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1e720 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1e730 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1e740 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1e750 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1e760 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1e770 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1e780 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e790 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1e7a0 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1e7b0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1e7c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e7d0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1e7e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1e7f0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1e800 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1e810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1e820 65 65 45 6e 74 65 72 28 70 29 3b 0a 0a 23 69 66  eeEnter(p);..#if
1e830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e840 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e850 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 69 66  /* Figure out if
1e860 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69   this is a commi
1e870 74 20 6f 66 20 61 6e 20 55 4e 4c 4f 43 4b 45 44  t of an UNLOCKED
1e880 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
1e890 74 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  t .    ** requir
1e8a0 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 75 70  es a snapshot up
1e8b0 67 72 61 64 65 2e 20 49 66 20 73 6f 2c 20 73 6b  grade. If so, sk
1e8c0 69 70 20 61 6e 79 20 61 75 74 6f 2d 76 61 63 75  ip any auto-vacu
1e8d0 75 6d 20 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  um .    ** proce
1e8e0 73 73 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 69  ssing.  */.    i
1e8f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1e900 75 6d 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  um && (.        
1e910 30 3d 3d 70 42 74 2d 3e 64 62 2d 3e 62 55 6e 6c  0==pBt->db->bUnl
1e920 6f 63 6b 65 64 0a 20 20 20 20 20 7c 7c 20 30 3d  ocked.     || 0=
1e930 3d 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d  =sqlite3PagerCom
1e940 6d 69 74 52 65 71 75 69 72 65 73 55 70 67 72 61  mitRequiresUpgra
1e950 64 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  de(pBt->pPager) 
1e960 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 72  .    )){.      r
1e970 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
1e980 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
1e990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e9a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1e9b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e9c0 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
1e9d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1e9e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1e9f0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
1ea00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1ea10 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
1ea20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
1ea30 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
1ea40 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1ea50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ea60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ea70 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1ea80 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1ea90 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1eaa0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1eab0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1eac0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ead0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1eae0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1eaf0 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1eb00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1eb10 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1eb20 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1eb30 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1eb40 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1eb50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1eb60 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1eb70 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1eb80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1eb90 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1eba0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1ebb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1ebc0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1ebd0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1ebe0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1ebf0 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1ec00 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1ec10 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1ec20 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1ec30 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1ec40 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1ec50 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1ec60 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1ec70 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1ec80 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1ec90 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1eca0 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1ecb0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1ecc0 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1ecd0 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1ece0 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1ecf0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1ed00 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1ed10 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1ed20 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1ed30 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1ed40 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1ed50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1ed60 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1ed70 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1ed80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1ed90 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1eda0 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1edb0 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1edc0 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1edd0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1ede0 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1edf0 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1ee00 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1ee10 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1ee20 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1ee30 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
1ee40 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
1ee50 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
1ee60 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
1ee70 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
1ee80 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
1ee90 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1eea0 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1eeb0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1eec0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
1eed0 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
1eee0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1eef0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1ef00 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1ef10 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
1ef20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1ef30 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1ef40 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
1ef50 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
1ef60 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
1ef70 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
1ef80 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
1ef90 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
1efa0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1efb0 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
1efc0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
1efd0 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
1efe0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1eff0 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1f000 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
1f010 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
1f020 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
1f030 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
1f040 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f050 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
1f060 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1f070 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
1f080 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
1f090 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f0a0 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
1f0b0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1f0c0 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
1f0d0 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
1f0e0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1f0f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1f100 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
1f110 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1f120 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
1f130 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
1f140 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
1f150 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
1f160 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
1f170 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
1f180 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
1f190 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
1f1a0 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
1f1b0 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
1f1c0 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
1f1d0 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
1f1e0 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
1f1f0 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
1f200 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1f210 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
1f220 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1f230 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
1f240 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
1f250 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1f260 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1f270 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
1f280 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
1f290 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
1f2a0 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
1f2b0 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
1f2c0 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
1f2d0 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
1f2e0 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
1f2f0 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
1f300 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
1f310 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
1f320 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1f330 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
1f340 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
1f350 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
1f360 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
1f370 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
1f380 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
1f390 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
1f3a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1f3b0 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
1f3c0 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
1f3d0 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
1f3e0 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
1f3f0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
1f400 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
1f410 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
1f420 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
1f430 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1f440 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
1f450 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
1f460 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
1f470 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
1f480 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1f490 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
1f4a0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
1f4b0 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
1f4c0 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
1f4d0 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
1f4e0 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
1f4f0 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
1f500 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
1f510 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1f520 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1f530 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f540 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1f550 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1f560 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1f570 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1f580 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1f590 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f5a0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
1f5b0 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
1f5c0 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
1f5d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1f5e0 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
1f5f0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
1f600 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1f610 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1f620 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1f630 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
1f640 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f650 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
1f660 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
1f670 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f680 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
1f690 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1f6a0 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
1f6b0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1f6c0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1f6d0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1f6e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1f6f0 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1f700 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1f710 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1f720 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
1f730 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
1f740 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
1f750 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1f760 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
1f770 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1f780 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f790 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
1f7a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f7b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f7c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f7d0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
1f7e0 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
1f7f0 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
1f800 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
1f810 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
1f820 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f830 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1f840 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
1f850 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
1f860 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
1f870 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
1f880 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f890 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
1f8a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f8b0 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
1f8c0 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
1f8d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f8e0 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
1f8f0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1f900 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f910 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
1f920 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f930 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
1f940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f950 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1f960 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f970 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
1f980 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1f990 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1f9a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f9b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f9c0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1f9d0 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1f9e0 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1f9f0 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1fa00 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1fa10 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
1fa20 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1fa30 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
1fa40 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
1fa50 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
1fa60 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
1fa70 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
1fa80 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
1fa90 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
1faa0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
1fab0 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
1fac0 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
1fad0 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
1fae0 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
1faf0 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
1fb00 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1fb10 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
1fb20 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
1fb30 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
1fb40 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
1fb50 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
1fb60 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
1fb70 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
1fb80 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
1fb90 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
1fba0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
1fbb0 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
1fbc0 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
1fbd0 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
1fbe0 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
1fbf0 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
1fc00 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
1fc10 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
1fc20 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
1fc30 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
1fc40 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
1fc50 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
1fc60 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
1fc70 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
1fc80 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
1fc90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
1fca0 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
1fcb0 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
1fcc0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1fcd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
1fce0 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
1fcf0 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
1fd00 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
1fd10 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
1fd20 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
1fd30 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
1fd40 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
1fd50 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
1fd60 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
1fd70 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
1fd80 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
1fd90 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
1fda0 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
1fdb0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1fdc0 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
1fdd0 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
1fde0 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
1fdf0 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
1fe00 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
1fe10 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1fe20 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1fe30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
1fe40 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fe50 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
1fe60 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
1fe70 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
1fe80 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1fe90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
1fea0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1feb0 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1fec0 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
1fed0 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
1fee0 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
1fef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1ff00 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
1ff10 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
1ff20 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
1ff30 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
1ff40 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1ff50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ff60 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1ff70 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
1ff80 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
1ff90 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
1ffa0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1ffb0 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
1ffc0 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
1ffd0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1ffe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1fff0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
20000 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
20010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20020 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
20030 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
20040 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
20050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
20080 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
20090 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
200a0 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
200b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
200c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
200d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
200e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
200f0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
20100 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
20110 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
20120 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
20130 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
20140 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
20150 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
20160 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
20170 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  +){.        rele
20180 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
20190 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  e[i]);.        p
201a0 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
201b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
201c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
201d0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
201e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
201f0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
20200 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20210 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20220 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
20230 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
20240 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
20250 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
20260 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
20270 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
20280 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
20290 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
202a0 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
202b0 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
202c0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
202d0 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
202e0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
202f0 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
20300 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
20310 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
20320 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
20330 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
20340 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20350 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
20360 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
20370 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
20380 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
20390 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
203a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
203b0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
203c0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
203d0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
203e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
203f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20400 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
20410 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
20420 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
20430 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
20440 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
20450 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
20460 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
20470 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20480 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
20490 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
204a0 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
204b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
204c0 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
204d0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
204e0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
204f0 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
20500 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20520 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
20530 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
20540 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
20550 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20560 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
20570 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
20580 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20590 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
205a0 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
205b0 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
205c0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
205d0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
205e0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
205f0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
20600 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
20610 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
20620 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
20630 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
20640 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
20650 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
20660 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
20670 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
20680 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
20690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
206a0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
206b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
206c0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
206d0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
206e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
206f0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
20700 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
20710 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
20720 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
20730 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
20740 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
20750 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
20760 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
20770 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
20780 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
20790 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
207a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
207b0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
207c0 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
207d0 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
207e0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
207f0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
20800 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
20810 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
20820 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
20830 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
20840 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
20850 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
20860 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
20870 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
20880 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
20890 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
208a0 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
208b0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
208c0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
208d0 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
208e0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
208f0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
20900 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
20910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
20920 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
20930 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
20940 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
20950 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
20960 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
20970 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
20980 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
20990 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
209a0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
209b0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
209c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
209d0 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
209e0 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
209f0 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
20a00 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
20a10 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
20a20 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
20a30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
20a40 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
20a50 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
20a60 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
20a70 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
20a80 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
20a90 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
20aa0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
20ab0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
20ac0 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
20ad0 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
20ae0 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
20af0 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
20b00 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
20b10 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
20b20 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
20b30 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
20b40 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
20b50 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
20b60 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
20b70 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
20b80 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
20b90 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
20ba0 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
20bb0 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
20bc0 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
20bd0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
20be0 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
20bf0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
20c00 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
20c10 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
20c20 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
20c30 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
20c40 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
20c50 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
20c60 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
20c70 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
20c80 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
20c90 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
20ca0 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
20cb0 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
20cc0 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
20cd0 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
20ce0 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
20cf0 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
20d00 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
20d10 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
20d20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
20d30 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
20d40 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
20d50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
20d60 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20d70 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
20d80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
20d90 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
20da0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20db0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
20dc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
20dd0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
20de0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
20df0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
20e00 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
20e10 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
20e20 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
20e30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20e40 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
20e50 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
20e60 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
20e70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
20e80 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
20e90 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
20ea0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
20eb0 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
20ec0 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
20ed0 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
20ee0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
20ef0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
20f00 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
20f10 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
20f20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
20f30 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
20f40 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
20f50 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20f60 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
20f70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20f80 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
20f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
20fa0 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
20fb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20fd0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
20fe0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
20ff0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
21000 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
21010 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
21020 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
21030 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
21040 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
21050 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
21060 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
21070 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
21080 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
21090 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
210a0 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
210b0 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
210c0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
210d0 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
210e0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
210f0 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
21100 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
21110 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
21120 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
21130 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
21140 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
21150 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
21160 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
21170 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
21180 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
21190 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
211a0 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
211b0 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
211c0 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
211d0 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
211e0 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
211f0 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
21200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21210 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
21220 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
21230 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
21240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21250 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
21260 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21270 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21280 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21290 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
212a0 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
212b0 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
212c0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
212d0 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
212e0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
212f0 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
21300 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
21310 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
21320 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21330 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
21340 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21350 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
21360 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
21370 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
21380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21390 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
213a0 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
213b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
213c0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
213d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
213e0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
213f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
21400 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
21410 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
21420 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
21430 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
21440 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
21450 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21460 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
21470 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
21480 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
21490 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
214a0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
214b0 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
214c0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
214d0 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
214e0 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
214f0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
21500 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
21510 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
21520 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21530 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
21540 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21550 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
21560 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
21570 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
21580 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
21590 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
215a0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
215b0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
215c0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
215d0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
215e0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
215f0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
21600 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
21610 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
21620 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
21630 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
21640 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
21650 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
21660 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
21670 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
21680 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
21690 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
216a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
216b0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
216c0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
216d0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
216e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
216f0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
21700 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
21710 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
21720 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
21730 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
21740 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
21750 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
21760 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
21770 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
21780 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
21790 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
217a0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
217b0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
217c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
217d0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
217e0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
217f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
21800 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
21810 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
21820 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
21830 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
21840 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
21850 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
21860 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
21870 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
21880 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
21890 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
218a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
218b0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
218c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
218d0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
218e0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
218f0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
21900 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
21910 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
21920 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
21930 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
21940 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
21950 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
21960 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
21970 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
21980 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
21990 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
219a0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
219b0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
219c0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
219d0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
219e0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
219f0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
21a00 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
21a10 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
21a20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
21a30 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  **.** It is assu
21a40 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c  med that the sql
21a50 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
21a60 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63  ero() has been c
21a70 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72  alled.** on pCur
21a80 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
21a90 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  he memory space 
21aa0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
21ab0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
21ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
21ad0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
21ae0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
21af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b00 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
21b10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
21b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b40 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
21b50 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
21b60 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b80 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
21b90 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
21ba0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
21bb0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21bd0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
21be0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
21bf0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
21c00 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c20 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
21c30 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74  ursor */.){.  Bt
21c40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21c50 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
21c60 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62       /* Shared b
21c70 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  -tree handle */.
21c80 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20    BtCursor *pX; 
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21cb0 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61  ing over other a
21cc0 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20  ll cursors */.. 
21cd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21ce0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
21cf0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
21d00 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
21d10 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
21d20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
21d30 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
21d40 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
21d50 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
21d60 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
21d70 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
21d80 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
21d90 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
21da0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
21db0 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
21dc0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
21dd0 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
21de0 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
21df0 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
21e00 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
21e10 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
21e20 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
21e30 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
21e40 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
21e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
21e60 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
21e70 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
21e80 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
21e90 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
21ea0 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
21eb0 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
21ec0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
21ed0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
21ee0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
21ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
21f00 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
21f10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
21f20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
21f30 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
21f40 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
21f60 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d  Flag==0 || (pBt-
21f70 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
21f80 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
21f90 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ..  if( wrFlag )
21fa0 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65  {.    allocateTe
21fb0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
21fc0 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
21fd0 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  pace==0 ) return
21fe0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21ff0 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
22000 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
22010 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
22020 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
22030 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
22040 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
22050 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
22060 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
22070 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
22080 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
22090 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
220a0 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
220b0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
220c0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
220d0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
220e0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
220f0 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
22100 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
22110 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
22120 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
22130 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
22140 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
22150 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22160 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43  0 || wrFlag==BTC
22170 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20  F_WriteFlag );. 
22180 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22190 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
221a0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
221b0 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
221c0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
221d0 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
221e0 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
221f0 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
22200 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
22210 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
22220 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
22230 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
22240 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
22250 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
22260 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
22270 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
22280 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
22290 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
222a0 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
222b0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
222c0 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
222d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
222e0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
222f0 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
22300 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
22310 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
22320 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
22330 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
22340 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
22350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22360 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
22370 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22380 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
223b0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
223c0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223e0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
223f0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
22400 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
22410 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
22440 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
22450 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
22460 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22490 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
224a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
224b0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
224d0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
224e0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
224f0 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
22500 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
22510 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
22520 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
22530 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22540 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
22550 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
22560 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
22570 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
22580 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
22590 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
225a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
225b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
225c0 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
225d0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
225e0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
225f0 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
22600 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
22610 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
22620 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
22630 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
22640 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
22650 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
22660 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
22670 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
22680 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
22690 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
226a0 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
226b0 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
226c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
226d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
226e0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
226f0 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
22700 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
22710 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
22720 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
22730 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
22740 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
22750 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
22760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
22770 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
22780 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
22790 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
227a0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
227b0 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
227c0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
227d0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
227e0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
227f0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
22800 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
22810 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
22820 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
22830 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
22840 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
22850 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
22860 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
22870 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
22880 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
22890 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
228a0 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
228b0 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
228c0 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
228d0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
228e0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
228f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22900 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
22910 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
22920 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
22930 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22940 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
22950 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
22960 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
22970 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
22980 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
22990 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
229a0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
229b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
229c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
229d0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
229e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
229f0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
22a00 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
22a10 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
22a20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
22a30 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
22a40 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
22a50 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
22a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22a70 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
22a80 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
22a90 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
22aa0 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
22ab0 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
22ac0 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
22ad0 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
22ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22af0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
22b00 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
22b10 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
22b20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
22b30 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
22b40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
22b50 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
22b60 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
22b70 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
22b80 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
22b90 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
22ba0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
22bb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
22bc0 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
22bd0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
22be0 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
22bf0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22c00 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
22c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
22c30 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
22c40 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
22c50 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
22c60 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
22c70 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
22c80 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
22c90 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
22ca0 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
22cb0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
22cc0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
22cd0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
22ce0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
22cf0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
22d00 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
22d10 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
22d20 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
22d30 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
22d40 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
22d50 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
22d60 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
22d70 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
22d80 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
22d90 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
22da0 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
22db0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
22dc0 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
22dd0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
22de0 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
22df0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
22e00 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
22e10 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
22e20 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
22e30 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
22e40 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
22e50 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
22e60 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
22e70 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
22e80 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
22e90 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
22ea0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
22eb0 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
22ec0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
22ed0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
22ee0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
22f00 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
22f10 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
22f20 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
22f30 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
22f40 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
22f50 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
22f60 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
22f70 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
22f80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
22f90 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
22fa0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
22fb0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
22fc0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
22fd0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
22fe0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
22ff0 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
23000 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
23010 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
23020 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
23030 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
23040 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
23050 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
23060 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
23070 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
23080 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
23090 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
230a0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
230b0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
230c0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
230d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
230e0 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
230f0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
23100 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
23110 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23120 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
23130 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
23140 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
23150 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
23160 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
23170 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
23180 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
23190 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
231a0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
231b0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
231c0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
231d0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
231e0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
231f0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
23200 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
23210 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
23220 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
23230 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
23240 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
23250 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
23260 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
23270 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23280 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
23290 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
232a0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
232b0 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
232c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
232d0 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
232e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
232f0 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
23300 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
23310 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23320 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
23330 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23340 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23350 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23360 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23370 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
23380 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
23390 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
233a0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74  info.nKey;.  ret
233b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
233c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
233d0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
233e0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
233f0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
23400 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
23410 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
23420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23430 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
23440 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
23450 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23460 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
23470 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
23480 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23490 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
234a0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
234b0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
234c0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
234d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
234e0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
234f0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
23500 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
23510 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
23520 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
23530 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
23540 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
23550 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
23560 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
23570 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
23580 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
23590 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
235a0 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
235b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
235c0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
235d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
235e0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
235f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
23600 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23610 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23620 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23630 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23640 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23660 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
23670 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
23680 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23690 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
236a0 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  ge]->intKeyLeaf=
236b0 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  =1 );.  getCellI
236c0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
236d0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
236e0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  .nPayload;.  ret
236f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23700 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
23710 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
23720 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
23730 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
23740 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
23750 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
23760 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
23770 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
23780 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
23790 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
237a0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
237b0 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
237c0 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
237d0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
237e0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
237f0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
23800 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
23810 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
23820 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
23830 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
23840 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
23850 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
23860 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
23870 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
23880 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
23890 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
238a0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
238b0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
238c0 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
238d0 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
238e0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
238f0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
23900 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
23910 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
23920 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
23930 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
23940 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
23950 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
23960 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
23970 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
23980 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
23990 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
239a0 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
239b0 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
239c0 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
239d0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
239e0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
239f0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
23a00 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
23a10 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
23a20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
23a30 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
23a40 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
23a50 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
23a60 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
23a70 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
23a80 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
23a90 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
23aa0 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
23ab0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23ac0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
23ad0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23ae0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23af0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
23b00 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
23b10 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
23b20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
23b30 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
23b40 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
23b50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
23b60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23b70 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
23b80 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
23b90 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
23ba0 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
23bb0 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
23bc0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
23bd0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
23be0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
23bf0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
23c00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23c10 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
23c20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
23c30 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
23c40 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
23c50 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
23c60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23c70 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
23c80 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
23c90 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
23ca0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
23cb0 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
23cc0 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
23cd0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
23ce0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
23cf0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
23d00 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
23d10 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
23d20 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
23d30 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
23d40 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
23d50 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
23d60 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
23d70 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
23d80 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
23d90 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
23da0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
23db0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
23dc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
23dd0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
23de0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
23df0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
23e00 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
23e10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
23e20 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
23e30 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
23e40 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
23e50 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
23e60 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
23e70 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
23e80 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
23e90 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
23ea0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
23eb0 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
23ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23ed0 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
23ee0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
23ef0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
23f00 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
23f10 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
23f20 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
23f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23f40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
23f50 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
23f60 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
23f70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
23f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
23f90 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
23fa0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
23fb0 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
23fc0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
23fd0 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
23fe0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23ff0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
24000 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
24010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24020 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
24030 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
24040 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24050 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
24060 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
24070 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
24080 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
24090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
240a0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
240b0 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
240c0 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
240d0 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
240e0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
240f0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
24100 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
24110 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
24120 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
24130 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
24140 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
24150 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
24160 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
24170 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
24180 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
24190 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
241a0 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
241b0 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
241c0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
241d0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
241e0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
241f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24200 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
24210 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
24220 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
24230 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
24240 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
24250 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
24260 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
24270 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
24280 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
24290 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
242a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
242b0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
242c0 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
242d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
242e0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
242f0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
24300 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
24310 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
24320 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
24330 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
24340 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24350 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
24360 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
24370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24380 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
24390 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
243a0 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
243b0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
243c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
243d0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
243e0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
243f0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
24400 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
24410 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
24420 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
24430 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
24440 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24450 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
24460 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24470 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
24480 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
24490 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
244a0 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
244b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
244c0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
244d0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
244e0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
244f0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
24500 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
24510 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
24520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24530 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24540 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
24550 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
24560 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
24570 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
24580 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
24590 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
245a0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
245b0 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
245c0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
245d0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
245e0 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
245f0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
24600 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
24610 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
24620 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
24630 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
24640 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
24650 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
24660 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  2: The operation
24670 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e   is a read. Do n
24680 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ot populate the 
24690 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
246a0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
246b0 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
246c0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
246d0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
246e0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
246f0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
24700 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
24710 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
24720 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
24730 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
24740 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
24750 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
24760 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
24770 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
24780 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
24790 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
247a0 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
247b0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
247c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
247d0 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72  nd the.** eOp ar
247e0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c  gument is not 2,
247f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
24800 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ay allocate spac
24810 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
24820 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74   .** populates t
24830 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
24840 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
24850 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
24860 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
24870 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
24880 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
24890 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
248a0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
248b0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
248c0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
248d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
248e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
248f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
24900 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
24910 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
24920 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
24930 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
24940 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
24950 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
24960 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
24970 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
24980 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
24990 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
249a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
249b0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
249c0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
249d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
249e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
249f0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
24a00 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
24a10 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
24a20 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
24a30 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
24a40 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
24a50 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
24a60 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
24a70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
24a80 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
24a90 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
24aa0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
24ab0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
24ac0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
24ad0 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
24ae0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
24af0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
24b00 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
24b10 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
24b20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
24b30 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
24b40 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24b50 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
24b60 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
24b70 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
24b80 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
24b90 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
24ba0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
24bb0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
24bc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
24bd0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
24be0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24bf0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
24c00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
24c10 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24c20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20  e[pCur->iPage]; 
24c30 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
24c40 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
24c50 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
24c60 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
24c90 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
24ca0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
24cb0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
24cc0 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
24cd0 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
24ce0 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a  ufStart = pBuf;.
24cf0 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20    int bEnd;     
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24d20 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74  rue if reading t
24d30 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f  o end of data */
24d40 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
24d50 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
24d60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24d70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24d90 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24da0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
24db0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
24dc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24dd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24de0 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f  ert( eOp!=2 || o
24df0 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f  ffset==0 );    /
24e00 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66  * Always start f
24e10 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f  rom beginning fo
24e20 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67  r eOp==2 */..  g
24e30 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
24e40 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
24e50 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
24e60 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ad;.#ifdef SQLIT
24e70 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
24e80 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20  W_READ.  bEnd = 
24e90 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72  offset+amt==pCur
24ea0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
24eb0 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
24ec0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
24ed0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
24ee0 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61  oad );..  if( &a
24ef0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
24f00 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50  fo.nLocal] > &pP
24f10 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
24f20 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20  usableSize] ){. 
24f30 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
24f40 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
24f50 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
24f60 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
24f70 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
24f80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24f90 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
24fa0 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75  Check if data mu
24fb0 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74  st be read/writt
24fc0 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62  en to/from the b
24fd0 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66  tree page itself
24fe0 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65  . */.  if( offse
24ff0 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t<pCur->info.nLo
25000 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61  cal ){.    int a
25010 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20   = amt;.    if( 
25020 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69  a+offset>pCur->i
25030 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
25040 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e      a = pCur->in
25050 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73  fo.nLocal - offs
25060 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  et;.    }.    rc
25070 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
25080 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d  aPayload[offset]
25090 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20  , pBuf, a, (eOp 
250a0 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e  & 0x01), pPage->
250b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
250c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
250d0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
250e0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
250f0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
25100 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
25110 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
25120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
25130 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
25140 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
25150 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
25160 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
25170 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
25180 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
25190 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
251a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
251b0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
251c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
251d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
251e0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
251f0 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
25200 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
25210 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
25220 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
25230 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
25240 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
25250 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
25260 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
25270 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
25280 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
25290 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
252a0 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
252b0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
252c0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
252d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
252e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
252f0 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
25300 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
25310 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
25320 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
25330 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
25340 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
25350 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
25360 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
25370 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
25380 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
25390 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
253a0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
253b0 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
253c0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
253d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
253e0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
253f0 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
25400 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
25410 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
25420 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
25430 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
25440 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
25450 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  te3Realloc(.    
25460 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25470 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32  verflow, nOvfl*2
25480 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20  *sizeof(Pgno).  
25490 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
254a0 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
254b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
254c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
254d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
254e0 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66        pCur->nOvf
254f0 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32  lAlloc = nOvfl*2
25500 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
25510 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e  ->aOverflow = aN
25520 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
25530 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25550 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
25560 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
25570 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66   0, nOvfl*sizeof
25580 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20  (Pgno));.       
25590 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
255a0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  |= BTCF_ValidOvf
255b0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
255c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
255d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
255e0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
255f0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
25600 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
25610 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
25620 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
25630 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
25640 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
25650 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
25660 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  */.    if( (pCur
25670 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
25680 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 0a  F_ValidOvfl)!=0.
25690 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 61 4f       && pCur->aO
256a0 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
256b0 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29 7b 0a  vflSize].    ){.
256c0 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
256d0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
256e0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
256f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25700 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
25710 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
25720 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
25730 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
25740 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
25750 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
25760 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20 20  iIdx++){..      
25770 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
25780 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
25790 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
257a0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
257b0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
257c0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
257d0 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)!=0 ){.    
257e0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
257f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
25800 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
25810 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
25820 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
25830 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
25840 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
25850 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25860 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c  if( offset>=ovfl
25870 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
25880 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  /* The only reas
25890 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  on to read this 
258a0 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69  page is to obtai
258b0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  n the page.     
258c0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72     ** number for
258d0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
258e0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
258f0 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20  hain. The page. 
25900 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69         ** data i
25910 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20  s not required. 
25920 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20  So first try to 
25930 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66  lookup the overf
25940 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  low.        ** p
25950 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20  age-list cache, 
25960 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c  if any, then fal
25970 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65  l back to the ge
25980 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a  tOverflowPage().
25990 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
259a0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
259b0 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
259c0 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c  that the aOverfl
259d0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20  ow[] array must 
259e0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63  be allocated bec
259f0 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20  ause eOp!=2.    
25a00 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66      ** here.  If
25a10 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66   eOp==2, then of
25a20 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73  fset==0 and this
25a30 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72   branch is never
25a40 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20   taken..        
25a50 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
25a60 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20  t( eOp!=2 );.   
25a70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25a80 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25a90 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a  CF_ValidOvfl );.
25aa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
25ab0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25ac0 3d 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20  ==pBt->db );.   
25ad0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
25ae0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
25af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
25b00 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
25b10 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
25b20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25b40 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
25b50 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
25b60 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
25b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25b80 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
25b90 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
25ba0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
25bb0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
25bc0 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
25bd0 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
25be0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
25bf0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
25c00 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
25c10 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
25c20 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
25c30 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
25c40 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25c50 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
25c60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
25c70 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20  e *fd;.#endif.  
25c80 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
25c90 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
25ca0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
25cb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
25cc0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
25cd0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
25ce0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
25cf0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
25d00 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
25d10 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
25d20 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
25d30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
25d40 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
25d50 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
25d60 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
25d70 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
25d80 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
25d90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
25da0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
25db0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
25dc0 20 20 20 33 29 20 74 68 65 20 64 61 74 61 62 61     3) the databa
25dd0 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65  se is file-backe
25de0 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  d, and.        *
25df0 2a 20 20 20 34 29 20 74 68 65 72 65 20 69 73 20  *   4) there is 
25e00 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72  no open write-tr
25e10 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
25e20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74         **   5) t
25e30 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
25e40 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  ot a WAL databas
25e50 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  e,.        **   
25e60 36 29 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  6) all data from
25e70 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
25e80 6e 67 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20  ng read..       
25e90 20 2a 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73   **   7) at leas
25ea0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
25eb0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
25ec0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
25ed0 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
25ee0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
25ef0 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
25f00 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
25f10 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
25f20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
25f30 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
25f40 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
25f50 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
25f60 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
25f70 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
25f80 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
25f90 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
25fa0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
25fb0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
25fc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25fd0 66 28 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30  f( (eOp&0x01)==0
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
26010 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
26020 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26050 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
26060 20 20 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d    && (bEnd || a=
26070 3d 6f 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20  =ovflSize)      
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
260a0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
260b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
260c0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20  ==TRANS_READ    
260d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260e0 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
260f0 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c      && (fd = sql
26100 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
26110 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65  t->pPager))->pMe
26120 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29  thods     /* (3)
26130 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26140 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
26150 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20  ta[19]==0x01    
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20     /* (5) */.   
26180 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d        && &pBuf[-
26190 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20  4]>=pBufStart   
261a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
261c0 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  7) */.        ){
261d0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
261e0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
261f0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
26200 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
26210 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
26220 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26240 20 20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63           /* henc
26250 65 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20  e (7) */.       
26260 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
26270 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
26280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26290 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
262a0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
262b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
262c0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
262d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
262e0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
262f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
26300 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
26310 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
26320 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
26330 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
26340 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
26350 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
26360 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
26370 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
26380 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
26390 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
263a0 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29       ((eOp&0x01)
263b0 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
263c0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
263d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
263e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
263f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26400 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
26410 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
26420 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
26430 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
26440 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
26450 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
26460 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
26470 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
26480 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
26490 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c  , a, (eOp&0x01),
264a0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
264b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
264c0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
264d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
264e0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
264f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26500 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
26510 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
26520 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
26530 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
26540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26550 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
26560 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26570 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
26580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26590 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
265a0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
265b0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
265c0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
265d0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
265e0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
265f0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
26600 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
26610 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
26620 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
26630 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
26640 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
26650 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
26660 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
26670 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
26680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
26690 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
266a0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
266b0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
266c0 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
266d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
266e0 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
266f0 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
26700 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
26710 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26720 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
26730 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
26740 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
26750 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
26760 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26770 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26780 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26790 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
267a0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
267b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
267c0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
267d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
267e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
267f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26800 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
26810 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
26820 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
26830 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
26840 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
26850 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
26860 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
26870 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
26880 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
26890 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
268a0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
268b0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
268c0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
268d0 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
268e0 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
268f0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
26900 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
26910 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
26920 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
26930 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
26940 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
26950 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
26960 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
26970 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
26980 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
26990 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
269a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
269b0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
269c0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
269d0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
269e0 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
269f0 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
26a00 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
26a10 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
26a20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26a30 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
26a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
26a50 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
26a60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26a70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26a80 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
26a90 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
26aa0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
26ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26ac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26ad0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26ae0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
26af0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26b00 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
26b10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26b20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26b40 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
26b50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26b60 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
26b70 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
26b80 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
26b90 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
26ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
26bc0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
26bd0 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
26be0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
26bf0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
26c00 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
26c10 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
26c20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
26c30 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
26c40 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
26c50 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
26c60 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
26c70 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
26c80 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
26c90 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
26ca0 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
26cb0 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
26cc0 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
26cd0 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
26ce0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
26cf0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
26d00 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
26d10 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
26d20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
26d30 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26d40 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
26d50 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
26d60 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
26d70 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
26d80 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
26d90 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
26da0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
26db0 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
26dc0 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
26dd0 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
26de0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
26df0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
26e00 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
26e10 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
26e20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
26e30 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
26e40 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
26e50 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
26e60 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
26e70 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
26e80 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
26e90 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
26ea0 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
26eb0 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
26ec0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
26ed0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
26ee0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
26ef0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
26f00 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
26f10 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
26f20 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
26f30 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
26f40 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
26f50 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
26f60 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
26f70 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
26f80 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
26f90 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
26fa0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
26fb0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
26fc0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
26fd0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
26fe0 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
26ff0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
27000 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
27010 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
27020 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a  /.){.  u32 amt;.
27030 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
27040 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
27050 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
27060 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27080 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27090 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
270a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
270b0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
270c0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
270d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
270e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
270f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27100 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27110 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
27120 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27130 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
27140 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27150 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
27160 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27170 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
27180 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27190 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 20 7c 7c  iPage]->aData ||
271a0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
271b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
271c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
271d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
271e0 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64  iPage]->aDataEnd
271f0 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a   ||CORRUPT_DB);.
27200 20 20 61 6d 74 20 3d 20 28 69 6e 74 29 28 70 43    amt = (int)(pC
27210 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27220 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74 61 45 6e  >iPage]->aDataEn
27230 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
27240 50 61 79 6c 6f 61 64 29 3b 0a 20 20 69 66 28 20  Payload);.  if( 
27250 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27260 6c 3c 61 6d 74 20 29 20 61 6d 74 20 3d 20 70 43  l<amt ) amt = pC
27270 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
27280 0a 20 20 2a 70 41 6d 74 20 3d 20 61 6d 74 3b 0a  .  *pAmt = amt;.
27290 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
272a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
272b0 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
272c0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
272d0 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
272e0 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
272f0 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
27300 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
27310 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
27320 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
27330 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
27340 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
27350 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
27360 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
27370 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
27380 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
27390 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
273a0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
273b0 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
273c0 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
273d0 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
273e0 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
273f0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
27400 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
27410 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
27420 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
27430 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
27440 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
27450 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
27460 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
27470 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
27480 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
27490 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
274a0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
274b0 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
274c0 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
274d0 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
274e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
274f0 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
27500 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
27510 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
27520 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27530 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
27540 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
27550 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f  Cur, pAmt);.}.co
27560 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
27570 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
27580 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27590 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
275a0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
275b0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
275c0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
275d0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
275e0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
275f0 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
27600 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
27610 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
27620 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
27630 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
27640 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27650 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
27660 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
27670 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
27680 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
27690 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
276a0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
276b0 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
276c0 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
276d0 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
276e0 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
276f0 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
27700 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
27710 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
27720 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
27730 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
27740 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
27750 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
27760 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
27770 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
27780 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27790 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
277a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
277b0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
277c0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
277d0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
277e0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
277f0 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
27800 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
27810 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
27820 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
27830 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
27840 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27850 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27860 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66  .  }.  pCur->inf
27870 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
27880 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
27890 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
278a0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
278b0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
278c0 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ++;.  pCur->aiId
278d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
278e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74   0;.  return get
278f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
27900 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d   newPgno, &pCur-
27910 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27920 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
27940 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ur, pCur->curPag
27950 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66  erFlags);.}..#if
27960 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
27970 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
27980 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
27990 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
279a0 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
279b0 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
279c0 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
279d0 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
279e0 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
279f0 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
27a00 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
27a10 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
27a20 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
27a30 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
27a40 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
27a50 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
27a60 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
27a70 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
27a80 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
27a90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
27aa0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
27ab0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
27ac0 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
27ad0 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43  iChild){.  if( C
27ae0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
27af0 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64  rn;  /* The cond
27b00 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65  itions tested be
27b10 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  low might not be
27b20 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20 20   true.          
27b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b40 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70    ** in a corrup
27b50 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
27b60 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
27b70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
27b80 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
27b90 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
27ba0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
27bb0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
27bc0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
27bd0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
27be0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
27bf0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
27c00 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
27c10 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
27c20 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
27c30 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
27c40 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
27c50 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
27c60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
27c70 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
27c80 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
27c90 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
27ca0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
27cb0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
27cc0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
27cd0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
27ce0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
27cf0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
27d00 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
27d10 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
27d20 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
27d30 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
27d40 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
27d50 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
27d60 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
27d70 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
27d80 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
27d90 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
27da0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27db0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27dc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27dd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27de0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27df0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
27e00 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
27e10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
27e20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
27e30 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
27e40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27e50 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
27e60 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27e70 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
27e80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27e90 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
27ea0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
27eb0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27ec0 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
27ed0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27ee0 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
27ef0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
27f00 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
27f10 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
27f20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
27f30 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
27f40 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
27f50 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
27f60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
27f70 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
27f80 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27f90 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
27fa0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
27fb0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
27fc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
27fd0 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
27fe0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
27ff0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
28000 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
28010 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
28020 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
28030 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
28040 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
28050 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
28060 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
28070 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
28080 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
28090 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
280a0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
280b0 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
280c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
280d0 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
280e0 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
280f0 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
28100 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
28110 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
28120 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
28130 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
28140 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
28150 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
28160 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28170 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
28180 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
28190 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
281a0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
281b0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
281c0 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
281d0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
281e0 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
281f0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
28200 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
28210 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28220 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
28230 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
28240 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
28250 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
28260 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
28270 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
28280 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
28290 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
282a0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
282b0 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
282c0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
282d0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
282e0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
282f0 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
28300 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
28310 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
28320 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
28330 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
28340 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
28350 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28360 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
28370 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
28380 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
28390 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
283a0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
283b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
283c0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
283d0 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
283e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
283f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
28400 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
28410 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
28420 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
28430 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
28440 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
28450 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
28460 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28470 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28480 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
28490 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
284a0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
284b0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
284c0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
284d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
284e0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
284f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28500 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
28510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28520 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
28530 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
28540 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
28550 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
28560 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
28570 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
28580 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
28590 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
285a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
285b0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
285c0 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e]!=0 );.      r
285d0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
285e0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
285f0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
28600 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
28610 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
28620 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
28630 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28640 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
28650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
28670 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28680 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
28690 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
286a0 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
286b0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
286c0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
286d0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
286f0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
28700 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
28710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28720 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
28730 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
28740 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
28750 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28760 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
28770 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
28780 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
28790 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
287a0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
287b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
287c0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
287d0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
287e0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
287f0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
28800 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
28810 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
28820 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
28830 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
28840 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
28850 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
28860 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
28870 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
28880 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
28890 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
288a0 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
288b0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
288c0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
288d0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
288e0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
288f0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
28900 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
28910 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
28920 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
28930 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
28940 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
28950 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
28960 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28970 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
28980 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
28990 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
289a0 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
289b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
289c0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
289d0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
289e0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
289f0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
28a00 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
28a10 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
28a20 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
28a30 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
28a40 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
28a50 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
28a60 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
28a70 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
28a80 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
28a90 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
28aa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28ab0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
28ac0 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
28ad0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
28ae0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28af0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28b00 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28b10 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
28b20 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
28b30 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
28b40 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
28b50 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
28b60 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
28b70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
28b80 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
28b90 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
28ba0 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
28bb0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
28bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28bd0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
28be0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
28bf0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
28c00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
28c10 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
28c20 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
28c30 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
28c40 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
28c50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
28c60 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28c70 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28c80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28c90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
28ca0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
28cb0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
28cc0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
28cd0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
28ce0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
28cf0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
28d00 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
28d10 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
28d20 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
28d30 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
28d40 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
28d50 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
28d60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28d70 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
28d80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
28d90 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
28da0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28db0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
28dc0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
28dd0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28de0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28df0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28e00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28e10 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
28e20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
28e30 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
28e40 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
28e50 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
28e60 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
28e70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
28e80 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
28e90 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
28ea0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
28eb0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
28ec0 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
28ed0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
28ee0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
28ef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
28f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
28f10 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
28f20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
28f30 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
28f40 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
28f50 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
28f60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
28f70 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
28f80 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
28f90 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
28fa0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
28fb0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
28fc0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
28fd0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
28fe0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
28ff0 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
29000 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
29010 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
29020 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
29030 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
29040 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
29050 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
29060 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
29070 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
29080 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
29090 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
290a0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
290b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
290c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
290d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
290e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
290f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29100 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29110 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
29120 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
29130 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
29140 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29150 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29160 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
29170 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29180 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
29190 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
291a0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
291b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
291c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
291d0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
291e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
291f0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
29200 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
29210 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
29220 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29230 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
29240 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29250 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
29260 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
29270 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
29280 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
29290 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
292a0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
292b0 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
292c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
292d0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
292e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
292f0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
29300 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29310 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
29320 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
29330 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
29340 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
29350 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
29360 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
29370 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
29380 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
29390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
293a0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
293b0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
293c0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
293d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
293e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
293f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29400 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29410 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29420 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
29430 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
29440 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
29450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29460 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29470 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
29480 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
29490 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
294a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
294b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
294c0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
294d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
294e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
294f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29500 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29510 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
29520 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
29530 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
29540 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
29550 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
29570 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29580 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
29590 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
295a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
295b0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
295c0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
295d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
295e0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
295f0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
29600 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
29610 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
29620 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
29630 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
29640 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29650 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29660 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
29670 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
29680 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29690 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
296a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
296b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
296c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
296d0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
296e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
296f0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
29700 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
29710 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
29720 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
29730 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29740 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
29750 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
29760 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
29770 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
29780 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
29790 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
297a0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
297b0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
297c0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
297d0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
297e0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
297f0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
29800 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
29810 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29820 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
29830 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
29840 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
29850 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29860 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29870 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
29880 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
29890 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
298a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
298b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
298c0 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
298d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
298e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
298f0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
29900 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
29910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
29920 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
29930 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
29940 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29950 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
29960 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
29970 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
29980 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
29990 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
299a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
299b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
299c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
299d0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
299e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
299f0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29a00 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
29a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29a20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
29a30 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
29a40 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
29a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
29a60 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
29a70 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
29a80 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
29a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29aa0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29ab0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
29ac0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
29ad0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
29ae0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
29af0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
29b00 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
29b10 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
29b20 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
29b30 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
29b40 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
29b50 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
29b60 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
29b70 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
29b80 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
29b90 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
29ba0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
29bb0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
29bc0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
29bd0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
29be0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
29bf0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
29c00 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
29c10 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
29c20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
29c30 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
29c40 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
29c50 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
29c60 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
29c70 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
29c80 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
29c90 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
29ca0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
29cb0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
29cc0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
29cd0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
29ce0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
29cf0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
29d00 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
29d10 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
29d20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
29d30 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
29d40 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
29d50 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
29d60 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
29d70 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
29d80 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
29d90 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
29da0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
29db0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
29dc0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
29dd0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
29de0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
29df0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
29e00 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
29e10 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
29e20 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
29e30 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
29e40 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
29e50 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
29e60 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
29e70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
29e80 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
29e90 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
29ea0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
29eb0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
29ec0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
29ed0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
29ee0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
29ef0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
29f00 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
29f10 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
29f20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
29f30 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
29f40 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29f50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
29f60 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
29f70 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
29f80 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
29f90 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
29fa0 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
29fb0 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
29fc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
29fd0 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
29fe0 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
29ff0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
2a000 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
2a010 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
2a020 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
2a050 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
2a060 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52  ){.  int rc;.  R
2a070 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65  ecordCompare xRe
2a080 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20  cordCompare;..  
2a090 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2a0a0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2a0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a0c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a0d0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a0e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2a0f0 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
2a100 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
2a110 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
2a120 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
2a130 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2a140 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2a150 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2a160 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2a170 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2a180 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2a190 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2a1a0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2a1b0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2a1c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2a1d0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a1e0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2a1f0 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
2a200 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29  ->curIntKey .  )
2a210 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2a220 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2a230 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2a240 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2a250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a260 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (pCu
2a270 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a280 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
2a290 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2a2a0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2a2b0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2a2c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a2d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
2a2e0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2a2f0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2a300 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2a310 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2a320 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2a330 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2a340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2a350 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2a360 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2a370 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2a380 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2a390 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2a3a0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2a3b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2a3c0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2a3d0 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2a3e0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2a3f0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2a400 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2a410 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2a420 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2a430 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a440 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2a450 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a460 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2a470 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2a480 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2a490 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a4a0 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
2a4b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a4c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2a4d0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
2a4e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a4f0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
2a500 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2a510 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2a520 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
2a530 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2a540 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2a550 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2a560 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a570 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2a580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a590 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2a5a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2a5b0 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63  >intKey==pCur->c
2a5c0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73  urIntKey );.  as
2a5d0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
2a5e0 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
2a5f0 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
2a600 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
2a610 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
2a620 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
2a630 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2a640 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a650 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
2a660 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a680 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2a690 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2a6a0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2a6b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2a6c0 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2a6d0 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2a6e0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2a6f0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2a700 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2a710 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2a720 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2a730 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2a740 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2a750 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2a760 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2a770 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2a780 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2a790 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2a7a0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2a7b0 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2a7c0 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2a7d0 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2a7e0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2a7f0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2a800 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2a810 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2a820 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2a830 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2a840 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2a850 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2a860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a870 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2a880 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a890 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2a8a0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2a8b0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2a8c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2a8d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2a8e0 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2a8f0 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2a900 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2a910 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2a920 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2a930 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2a940 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2a950 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a960 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2a970 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2a980 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2a990 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2a9a0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2a9b0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2a9c0 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2a9d0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2a9e0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2a9f0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2aa00 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2aa10 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2aa20 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2aa30 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2aa40 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
2aa50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2aa60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2aa70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2aa80 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2aa90 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2aaa0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2aab0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2aac0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2aad0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2aae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2aaf0 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2ab00 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2ab10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2ab20 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2ab30 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2ab40 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2ab50 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2ab60 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2ab70 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2ab80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2ab90 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2aba0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2abb0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2abc0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
2abd0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
2abe0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2abf0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2ac00 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2ac10 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2ac20 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2ac30 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2ac40 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2ac50 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2ac60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2ac70 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2ac80 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2ac90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
2aca0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2acb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2acc0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2acd0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2ace0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2acf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ad00 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2ad10 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2ad20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2ad30 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2ad40 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2ad50 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2ad60 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2ad70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2ad80 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2ad90 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2ada0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2adb0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2adc0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2add0 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
2ade0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2adf0 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
2ae00 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
2ae10 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
2ae20 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
2ae30 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
2ae40 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
2ae50 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
2ae60 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
2ae70 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
2ae80 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
2ae90 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
2aea0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
2aeb0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
2aec0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
2aed0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
2aee0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
2aef0 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
2af00 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2af10 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
2af20 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
2af30 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
2af40 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
2af50 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
2af60 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
2af70 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
2af80 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
2af90 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
2afa0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
2afb0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2afc0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
2afd0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
2afe0 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
2aff0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
2b000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b010 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
2b020 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
2b030 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
2b040 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
2b050 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
2b060 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2b070 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
2b080 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2b090 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
2b0a0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2b0b0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2b0c0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2b0d0 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
2b0e0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2b0f0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2b100 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2b110 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
2b120 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2b130 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
2b140 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
2b150 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
2b160 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
2b170 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
2b180 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
2b190 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
2b1a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2b1b0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2b1c0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
2b1d0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2b1e0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
2b1f0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2b200 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
2b210 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2b220 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b230 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
2b240 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2b250 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2b260 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2b270 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2b280 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
2b290 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b2a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2b2b0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
2b2c0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
2b2d0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2b2e0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
2b2f0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
2b300 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
2b310 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
2b320 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
2b330 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
2b340 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
2b350 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
2b360 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
2b370 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
2b380 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
2b390 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
2b3a0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
2b3b0 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
2b3c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2b3d0 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
2b3e0 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
2b3f0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2b400 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
2b410 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
2b420 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
2b430 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2b440 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
2b450 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
2b460 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
2b470 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
2b480 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
2b490 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
2b4b0 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
2b4c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
2b4d0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
2b4e0 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
2b4f0 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
2b500 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
2b510 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
2b520 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2b530 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2b540 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2b550 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2b560 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2b570 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2b580 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2b590 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2b5a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2b5b0 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2b5c0 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2b5d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2b5e0 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2b5f0 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2b600 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2b610 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2b620 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2b630 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2b640 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2b650 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2b660 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2b670 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2b680 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2b690 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2b6a0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2b6b0 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
2b6c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b6d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b6e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b6f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2b700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b710 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
2b720 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
2b730 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
2b740 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
2b750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2b760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2b770 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
2b780 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2b790 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2b7a0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2b7b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b7c0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b7d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b7e0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2b7f0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2b800 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2b810 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
2b820 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b830 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b840 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2b850 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2b860 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2b870 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2b880 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2b890 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2b8a0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2b8b0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2b8c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2b8d0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b8e0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2b8f0 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2b900 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2b910 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2b920 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2b930 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2b940 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2b950 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2b960 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2b970 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2b980 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2b990 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2b9a0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2b9b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b9c0 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2b9d0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2b9e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b9f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ba00 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2ba10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2ba20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ba30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2ba40 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2ba50 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2ba60 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2ba70 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2ba80 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2ba90 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2baa0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2bab0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2bac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2bad0 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2bae0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2baf0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2bb00 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2bb10 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2bb20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2bb30 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2bb40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2bb50 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2bb60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2bb70 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2bb80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2bb90 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2bba0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2bbb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2bbc0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2bbd0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2bbe0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bbf0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2bc00 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2bc10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2bc20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2bc30 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2bc40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bc50 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2bc60 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2bc70 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2bc80 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2bc90 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2bca0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2bcb0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2bcc0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2bcd0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2bce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2bcf0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2bd00 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2bd10 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2bd20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bd30 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2bd40 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2bd50 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2bd60 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2bd70 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2bd80 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2bd90 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2bda0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2bdb0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2bdc0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2bdd0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2bde0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2bdf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2be00 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2be10 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2be20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2be30 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2be40 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2be50 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2be60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2be70 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2be80 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2be90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2bea0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2beb0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2bec0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2bed0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2bee0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2bef0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2bf00 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2bf10 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2bf20 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2bf30 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2bf40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2bf50 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2bf60 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2bf70 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2bf80 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2bf90 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2bfa0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2bfb0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2bfc0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2bfd0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2bfe0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2bff0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2c000 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2c010 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2c020 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2c030 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2c040 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2c050 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2c060 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2c070 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2c080 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2c090 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2c0a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2c0b0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2c0c0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2c0d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2c0e0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2c0f0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2c100 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2c110 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2c120 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2c130 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2c140 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2c150 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2c160 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2c170 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2c180 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2c190 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2c1a0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2c1b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2c1c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2c1d0 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2c1e0 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2c1f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2c200 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2c210 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2c220 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2c230 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2c240 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2c250 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2c260 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2c270 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2c280 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2c290 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2c2a0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2c2b0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2c2c0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2c2d0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2c2e0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2c2f0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2c300 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2c310 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2c320 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2c330 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2c340 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2c350 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2c360 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2c370 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2c380 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2c390 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2c3a0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2c3b0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2c3c0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2c3d0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2c3e0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2c3f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2c400 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2c410 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2c420 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2c430 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2c440 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2c450 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2c460 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2c470 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2c480 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2c490 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2c4a0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2c4b0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2c4c0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2c4d0 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2c4e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2c4f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2c500 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c510 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2c520 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2c530 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2c540 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2c550 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2c560 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2c570 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  LID ){.    asser
2c580 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2c590 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
2c5a0 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  vfl)==0 );.    r
2c5b0 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2c5c0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2c5d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2c5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c5f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2c600 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2c610 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2c620 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2c630 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2c640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c660 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2c670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c680 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c690 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2c6a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c6b0 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2c6c0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2c6d0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2c6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2c6f0 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
2c700 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2c710 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2c720 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c730 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2c740 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2c750 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2c760 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2c770 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c780 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
2c790 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2c7a0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2c7b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2c7c0 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
2c7d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c7e0 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
2c7f0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2c800 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
2c810 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
2c820 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
2c830 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
2c840 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
2c850 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
2c860 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
2c870 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
2c880 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
2c890 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
2c8a0 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
2c8b0 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
2c8c0 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
2c8d0 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
2c8e0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
2c8f0 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
2c900 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
2c910 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
2c920 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
2c930 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
2c940 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
2c950 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
2c960 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c970 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
2c980 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2c990 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2c9a0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2c9b0 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2c9c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2c9d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65  urn rc;.      re
2c9e0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2c9f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2ca00 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2ca10 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2ca20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2ca30 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
2ca40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2ca50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2ca60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2ca70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2ca80 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2ca90 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
2caa0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2cab0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2cac0 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e];.    }while( 
2cad0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2cae0 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
2caf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2cb00 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2cb10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2cb20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2cb30 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2cb40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2cb50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cb60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2cb70 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2cb80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cb90 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2cba0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2cbb0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2cbc0 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65    }.}.int sqlite
2cbd0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
2cbe0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2cbf0 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pRes){.  MemPage
2cc00 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72   *pPage;.  asser
2cc10 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2cc20 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2cc30 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2cc40 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2cc50 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2cc60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cc70 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2cc80 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2cc90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2cca0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2ccb0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2ccc0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2ccd0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2cce0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2ccf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
2cd00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2cd10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2cd20 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2cd30 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70  pCur, pRes);.  p
2cd40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2cd50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2cd60 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d  ;.  if( (++pCur-
2cd70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2cd80 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  ge])>=pPage->nCe
2cd90 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ll ){.    pCur->
2cda0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2cdb0 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  e]--;.    return
2cdc0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2cdd0 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66   pRes);.  }.  if
2cde0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2cdf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ce00 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2ce10 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2ce20 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2ce30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2ce40 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2ce50 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2ce60 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2ce70 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2ce80 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2ce90 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2cea0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2ceb0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2cec0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2ced0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2cee0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
2cef0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
2cf00 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
2cf10 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
2cf20 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  =1..**.** The ma
2cf30 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2cf40 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  s sqlite3BtreePr
2cf50 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20  evious().  That 
2cf60 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2cf70 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2cf80 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2cf90 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69  erely decrementi
2cfa0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2cfb0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2cfc0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65  dx.** to the pre
2cfd0 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68  vious cell on th
2cfe0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
2cff0 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74   The (slower) bt
2d000 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a  reePrevious().**
2d010 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20   helper routine 
2d020 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2d030 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2d040 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2d050 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72  erent page.** or
2d060 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2d070 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  cursor..**.** Th
2d080 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2d090 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65  on will set *pRe
2d0a0 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68  s to 0 or 1.  Th
2d0b0 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  e initial *pRes 
2d0c0 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  value.** will be
2d0d0 20 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   1 if the cursor
2d0e0 20 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63   being stepped c
2d0f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
2d100 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a   SQL index and.*
2d110 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * if this routin
2d120 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2d130 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61  n skipped if tha
2d140 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  t SQL index had 
2d150 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65  been.** a unique
2d160 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69   index.  Otherwi
2d170 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  se the caller wi
2d180 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65  ll have set *pRe
2d190 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65  s to zero..** Ze
2d1a0 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ro is the common
2d1b0 20 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65   case. The btree
2d1c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2d1d0 69 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74  is free to use t
2d1e0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70  he.** initial *p
2d1f0 52 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68  Res value as a h
2d200 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70  int to improve p
2d210 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20  erformance, but 
2d220 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53  the current.** S
2d230 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2d240 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2d250 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20  not. (Note that 
2d260 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65  the comdb2 btree
2d270 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
2d280 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73  on does use this
2d290 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29   hint, however.)
2d2a0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2d2b0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2d2c0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2d2d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2d2e0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
2d2f0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
2d300 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2d310 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2d320 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2d330 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2d340 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2d350 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2d360 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2d370 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2d380 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d390 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2d3a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42  r->curFlags & (B
2d3b0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2d3c0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2d3d0 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b  alidNKey))==0 );
2d3e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d3f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2d400 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2d410 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d420 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  ID ){.    rc = r
2d430 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2d440 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2d450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d460 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2d470 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2d480 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2d490 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2d4a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2d4b0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2d4c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d4d0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2d4e0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2d4f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2d500 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d510 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2d520 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2d530 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2d540 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2d550 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2d560 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2d570 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20  pNext<0 ){.     
2d580 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2d590 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2d5a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d5b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2d5c0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2d5d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2d5e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2d5f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2d600 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2d610 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2d620 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d630 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
2d640 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2d650 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2d660 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2d670 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2d680 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2d690 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
2d6a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2d6b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2d6c0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2d6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
2d6e0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
2d6f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
2d700 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2d710 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2d720 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
2d730 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2d740 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
2d750 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2d760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d770 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d780 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2d790 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ur);.    }.    a
2d7a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2d7b0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2d7c0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2d7d0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2d7e0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2d7f0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2d800 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  );..    pCur->ai
2d810 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d820 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2d830 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d840 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2d850 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2d860 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2d870 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2d880 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2d890 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2d8a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d8b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2d8c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2d8d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
2d8e0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2d8f0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2d900 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d910 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2d920 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2d930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2d940 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2d950 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2d960 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2d970 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d980 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d990 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d9a0 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
2d9b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2d9c0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2d9d0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2d9e0 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2d9f0 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
2da00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2da10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2da20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
2da30 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64     || pCur->aiId
2da40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2da50 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70  0.   || pCur->ap
2da60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2da70 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  ]->leaf==0.  ){.
2da80 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2da90 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2daa0 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Res);.  }.  pCur
2dab0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2dac0 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  age]--;.  return
2dad0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2dae0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2daf0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
2db00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2db10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
2db20 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
2db30 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
2db40 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
2db50 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
2db60 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2db70 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
2db80 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
2db90 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
2dba0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
2dbb0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
2dbc0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
2dbd0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2dbe0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
2dbf0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
2dc00 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
2dc10 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
2dc20 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2dc30 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
2dc40 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
2dc50 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
2dc60 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
2dc70 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
2dc80 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
2dc90 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2dca0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
2dcb0 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
2dcc0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2dcd0 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
2dce0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
2dcf0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
2dd00 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
2dd10 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
2dd20 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
2dd30 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
2dd40 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
2dd50 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
2dd60 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
2dd70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2dd80 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
2dd90 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
2dda0 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
2ddb0 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
2ddc0 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
2ddd0 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
2dde0 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
2ddf0 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
2de00 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
2de10 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2de20 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
2de30 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
2de40 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
2de50 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
2de60 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
2de70 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
2de80 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2de90 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
2dea0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
2deb0 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
2dec0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
2ded0 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
2dee0 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
2def0 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
2df00 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2df10 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
2df20 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
2df30 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2df40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
2df50 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2df60 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2df70 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
2df80 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2df90 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
2dfa0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
2dfb0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2dfc0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2dfd0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2dfe0 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
2dff0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2e000 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
2e010 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
2e020 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
2e030 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
2e040 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
2e050 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
2e060 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2e070 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
2e080 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
2e090 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2e0a0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e0b0 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
2e0c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
2e0d0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
2e0e0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
2e0f0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
2e100 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
2e110 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
2e120 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
2e130 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
2e140 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
2e150 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e160 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e170 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2e180 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2e190 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
2e1a0 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
2e1b0 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
2e1c0 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
2e1d0 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
2e1e0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2e1f0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
2e200 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2e210 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
2e220 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
2e230 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
2e240 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2e250 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
2e260 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
2e270 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2e280 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2e290 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
2e2a0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2e2b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2e2c0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
2e2d0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
2e2e0 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
2e2f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e300 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e310 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
2e320 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2e330 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
2e340 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
2e350 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
2e360 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
2e370 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
2e380 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
2e390 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
2e3a0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
2e3b0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
2e3c0 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
2e3d0 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
2e3e0 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2e3f0 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
2e400 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
2e410 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
2e420 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2e430 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
2e440 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2e450 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
2e460 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2e470 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
2e480 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2e490 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
2e4a0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
2e4b0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
2e4c0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
2e4d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2e4e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2e4f0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
2e500 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
2e510 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
2e520 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
2e530 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2e540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2e550 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
2e560 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2e570 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
2e580 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2e590 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
2e5a0 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
2e5b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2e5c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e5d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
2e5e0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2e5f0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2e600 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
2e610 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2e620 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
2e630 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2e640 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2e650 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2e660 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
2e670 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
2e680 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
2e690 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
2e6a0 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
2e6b0 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
2e6c0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2e6d0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
2e6e0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
2e6f0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2e700 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2e710 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2e720 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e730 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
2e740 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2e750 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
2e760 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
2e770 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
2e780 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
2e790 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
2e7a0 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
2e7b0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
2e7c0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2e7d0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
2e7e0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
2e7f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
2e800 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
2e810 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2e820 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2e830 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
2e840 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
2e850 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
2e860 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2e870 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2e880 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
2e890 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
2e8a0 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
2e8b0 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
2e8c0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2e8d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2e8e0 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35  OF: R-01506-1105
2e8f0 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  3 The first inte
2e900 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2e910 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2e920 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70       ** is the p
2e930 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2e940 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20  e next freelist 
2e950 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2e960 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20  e list or.      
2e970 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69    ** zero if thi
2e980 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72  s is the last fr
2e990 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2e9a0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  e. */.        iT
2e9b0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2e9c0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2e9d0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
2e9e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2e9f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2ea00 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34  9841-13798 The 4
2ea10 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2ea20 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2ea30 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a  et 32.        **
2ea40 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65   stores the page
2ea50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
2ea60 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2ea70 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65   freelist, or ze
2ea80 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  ro if.        **
2ea90 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
2eaa0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
2eab0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2eac0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2ead0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
2eae0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
2eaf0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
2eb00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
2eb10 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e  runk>mxPage || n
2eb20 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a  Search++ > n ){.
2eb30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2eb40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2eb50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2eb60 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2eb70 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
2eb80 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2eb90 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2eba0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2ebb0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2ebc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2ebd0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2ebe0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2ebf0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2ec00 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2ec10 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2ec20 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
2ec30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ec40 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
2ec50 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
2ec60 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2ec70 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2ec80 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
2ec90 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
2eca0 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
2ecb0 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
2ecc0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2ecd0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2ece0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
2ecf0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
2ed00 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2ed10 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
2ed20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
2ed30 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
2ed40 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
2ed50 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
2ed60 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
2ed70 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
2ed80 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
2ed90 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2eda0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
2edb0 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
2edc0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
2edd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ede0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2edf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2ee00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2ee10 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2ee20 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2ee30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2ee40 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2ee50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2ee60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2ee70 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2ee80 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2ee90 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2eea0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
2eeb0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2eec0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2eed0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2eee0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2eef0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2ef00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2ef10 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
2ef20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2ef30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2ef40 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
2ef50 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
2ef60 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2ef70 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2ef80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ef90 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
2efa0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2efb0 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
2efc0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2efd0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
2efe0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
2eff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2f000 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
2f010 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
2f020 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2f030 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2f040 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f050 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
2f060 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
2f070 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
2f080 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2f090 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
2f0a0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2f0b0 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
2f0c0 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
2f0d0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2f0e0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2f0f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2f100 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
2f110 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2f120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f130 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2f140 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2f150 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f160 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f170 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2f180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f190 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
2f1a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2f1b0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2f1c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2f1e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2f1f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2f200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f210 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f220 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2f230 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2f240 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2f250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f270 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f280 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f2a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
2f2b0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2f2c0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2f2d0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2f2e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2f2f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2f300 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
2f310 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
2f320 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
2f330 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
2f340 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
2f350 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
2f360 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
2f370 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
2f380 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
2f390 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
2f3a0 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
2f3b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
2f3c0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
2f3d0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
2f3e0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
2f3f0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2f400 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
2f410 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
2f420 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
2f430 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2f460 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f470 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2f480 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
2f490 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
2f4a0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2f4b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2f4c0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2f4d0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2f4e0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2f4f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f510 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f520 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f530 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f540 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f550 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2f560 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2f570 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f590 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2f5a0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2f5b0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2f5c0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f5d0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f5e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2f5f0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2f600 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2f610 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2f620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2f630 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2f640 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2f650 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2f660 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2f670 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2f680 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2f690 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2f6a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2f6b0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2f6c0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2f6d0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2f6e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f6f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f700 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2f710 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
2f720 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2f730 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2f740 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2f750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f760 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f770 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f780 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
2f790 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2f7a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f7b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f7c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2f7d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2f7e0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
2f7f0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2f800 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
2f810 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2f820 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2f830 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2f840 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2f850 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2f860 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2f870 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2f880 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
2f890 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
2f8a0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
2f8b0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
2f8c0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
2f8d0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
2f8e0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
2f8f0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
2f900 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2f910 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
2f920 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
2f930 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
2f940 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2f950 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
2f960 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
2f970 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
2f980 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
2f990 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
2f9a0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
2f9c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
2f9d0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
2f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2f9f0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
2fa00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fa10 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2fa30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2fa40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fa50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
2fa60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2fa70 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
2fa80 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
2fa90 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
2faa0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
2fab0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2fac0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
2fad0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2fae0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
2faf0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
2fb00 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2fb10 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
2fb20 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
2fb30 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
2fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fb50 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
2fb60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fb70 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
2fb80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fb90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2fbb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
2fbc0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
2fbd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
2fbe0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
2fbf0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
2fc00 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
2fc10 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
2fc20 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2fc30 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
2fc40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
2fc50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2fc60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2fc70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2fc80 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2fc90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
2fca0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
2fcb0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2fcc0 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
2fcd0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
2fce0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
2fcf0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
2fd00 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fd10 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
2fd20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
2fd30 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
2fd40 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
2fd50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
2fd60 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2fd70 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
2fd80 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
2fd90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fda0 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
2fdb0 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
2fdd0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
2fde0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
2fdf0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
2fe00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fe10 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2fe20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2fe30 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2fe40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fe50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fe60 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
2fe70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2fe80 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
2fe90 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
2fea0 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
2feb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fec0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
2fed0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2fee0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
2fef0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
2ff00 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
2ff10 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
2ff20 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
2ff30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2ff40 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2ff50 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2ff60 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
2ff70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ff80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ff90 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2ffa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ffb0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
2ffc0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2ffd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2ffe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fff0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30000 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
30010 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
30020 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
30030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30040 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
30050 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
30060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30070 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30080 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
30090 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
300a0 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
300b0 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
300c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
300d0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
300e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
300f0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
30100 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
30110 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
30120 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
30130 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
30140 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
30150 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
30160 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
30170 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
30180 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
30190 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
301a0 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
301b0 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
301c0 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
301d0 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
301e0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
301f0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
30200 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
30210 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
30220 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
30230 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
30240 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
30250 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
30260 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
30270 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
30280 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
30290 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
302a0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
302b0 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
302c0 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
302d0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
302e0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
302f0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
30300 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
30310 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
30320 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
30330 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
30340 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
30350 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
30360 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
30370 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
30380 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
30390 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
303a0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
303b0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
303c0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
303d0 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
303e0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
303f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
30400 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
30410 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
30420 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
30430 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
30440 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
30450 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
30460 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
30470 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
30480 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
30490 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
304a0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
304b0 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
304c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
304d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
304e0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
304f0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
30500 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
30510 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
30520 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
30530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30540 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
30550 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
30560 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30570 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
30580 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
30590 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
305a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
305b0 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
305c0 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
305d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
305e0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
305f0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
30600 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
30610 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
30620 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
30630 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
30640 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
30650 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
30660 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
30670 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
30680 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
30690 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
306a0 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
306b0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
306c0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
306d0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
306e0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
306f0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
30700 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
30710 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
30720 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
30730 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
30740 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
30750 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
30760 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
30770 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
30780 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
30790 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
307a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
307b0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
307c0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
307d0 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
307e0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
307f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30800 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30810 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30820 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
30830 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30840 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
30850 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
30860 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
30870 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
30880 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
30890 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
308a0 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
308b0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
308c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
308d0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
308e0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
308f0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
30900 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
30910 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
30920 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
30930 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30940 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
30950 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30960 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
30970 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
30980 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
30990 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
309a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
309b0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
309c0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
309d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
309e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
309f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
30a00 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
30a10 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
30a20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30a30 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
30a40 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
30a50 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
30a60 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
30a70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30a80 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
30a90 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
30aa0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
30ab0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
30ac0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
30ad0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30ae0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
30af0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
30b00 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
30b10 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
30b20 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
30b30 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
30b40 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
30b50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30b60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30b70 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
30b80 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
30b90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30ba0 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
30bb0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
30bc0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
30bd0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
30be0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
30bf0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
30c00 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
30c10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
30c20 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
30c30 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
30c40 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
30c50 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
30c60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
30c70 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
30c80 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
30c90 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
30ca0 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
30cb0 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
30cc0 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
30cd0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
30ce0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
30cf0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
30d00 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
30d10 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
30d20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
30d30 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
30d40 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
30d50 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
30d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
30d70 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
30d80 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
30d90 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
30da0 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
30db0 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
30dc0 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
30dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
30de0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
30df0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
30e00 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
30e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
30e20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
30e30 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
30e40 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
30e50 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
30e60 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
30e70 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
30e80 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
30e90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
30ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30eb0 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
30ec0 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
30ed0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
30ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f00 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
30f10 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
30f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f30 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
30f40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
30f50 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
30f60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
30f70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30f80 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30f90 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
30fa0 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
30fb0 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
30fc0 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
30fd0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
30fe0 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
30ff0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
31000 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31010 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
31020 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
31030 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
31040 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
31050 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
31060 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
31070 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
31080 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
31090 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
310a0 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
310b0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
310c0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
310d0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
310e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
310f0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
31100 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
31110 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
31120 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31130 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
31140 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31150 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
31160 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
31170 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
31180 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
31190 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
311a0 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
311b0 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
311c0 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
311d0 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
311e0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
311f0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
31200 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
31210 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
31220 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31230 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
31240 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
31250 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
31260 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31270 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31280 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
31290 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
312a0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
312b0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
312c0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
312d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
312e0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
312f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31300 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
31310 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
31320 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
31330 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
31340 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
31350 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
31360 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31370 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
31380 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
31390 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
313a0 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
313b0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
313c0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
313d0 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
313e0 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
313f0 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
31400 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
31410 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
31420 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
31430 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
31440 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
31450 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
31460 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
31470 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
31480 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
31490 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
314a0 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
314b0 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
314c0 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
314d0 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
314e0 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
314f0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
31500 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
31510 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
31520 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
31530 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
31540 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
31550 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
31560 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
31570 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
31580 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
31590 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
315a0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
315b0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
315c0 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
315d0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
315e0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
315f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31600 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
31610 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
31620 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
31630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31650 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
31660 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
31670 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
31680 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
31690 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
316a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
316b0 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
316c0 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
316d0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
316e0 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
316f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31700 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
31710 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31720 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
31730 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
31740 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
31750 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
31760 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
31770 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
31780 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
31790 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
317a0 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
317b0 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
317c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
317d0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
317e0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
317f0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
31800 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
31810 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
31820 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
31830 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
31840 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
31850 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
31860 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
31870 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
31880 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
31890 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
318a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
318b0 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
318c0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
318d0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
318e0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
318f0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
31900 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
31910 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
31920 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
31930 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
31940 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
31950 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
31960 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
31970 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
31980 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
31990 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
319a0 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
319b0 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
319c0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
319d0 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
319e0 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
319f0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
31a00 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
31a10 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
31a20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
31a30 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
31a40 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
31a50 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
31a60 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
31a70 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
31a80 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
31a90 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
31aa0 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
31ab0 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
31ac0 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
31ad0 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
31ae0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31af0 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
31b00 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
31b10 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
31b20 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
31b30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
31b40 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
31b50 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
31b60 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
31b70 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
31b80 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
31b90 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
31ba0 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
31bb0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
31bc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31be0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
31bf0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
31c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31c10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
31c20 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31c30 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
31c40 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
31c50 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31c60 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
31c70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
31c80 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
31c90 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
31ca0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
31cb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
31cc0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
31cd0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31ce0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
31cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
31d00 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
31d10 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
31d20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
31d30 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
31d40 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
31d50 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
31d60 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
31d70 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
31d80 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
31d90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
31da0 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
31db0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
31dc0 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
31dd0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
31de0 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
31df0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
31e00 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
31e10 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
31e20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
31e30 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
31e40 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
31e50 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
31e60 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
31e70 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
31e80 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
31e90 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
31ea0 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
31eb0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
31ec0 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
31ed0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
31ee0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31ef0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
31f00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
31f10 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
31f20 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
31f30 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
31f40 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
31f50 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
31f60 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
31f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31f80 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
31f90 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
31fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31fb0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31fc0 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
31fd0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
31fe0 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
31ff0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
32000 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
32010 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
32020 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
32030 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
32040 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
32050 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
32060 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
32070 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
32080 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
32090 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
320a0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
320b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
320c0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
320d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
320e0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
320f0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
32100 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
32110 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
32120 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
32130 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
32140 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
32150 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
32160 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
32170 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
32180 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
32190 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
321a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
321b0 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74  iven Cell.  Writ
321c0 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43  e the.** local C
321d0 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75  ell size (the nu
321e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
321f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
32200 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20  ge, omitting.** 
32210 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a  overflow) into *
32220 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  pnSize..*/.stati
32230 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
32240 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32250 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
32260 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
32270 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a  tains the Cell *
32280 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
32290 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20  r *pCell,    /* 
322a0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
322b0 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20  e Cell */.  u16 
322c0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
322d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
322e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65  e size of the Ce
322f0 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ll here */.){.  
32300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32310 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
32320 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
32330 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
32340 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
32350 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
32360 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
32370 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32380 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
32390 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
323a0 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
323b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
323c0 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65  info);.  *pnSize
323d0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
323e0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
323f0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
32400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
32410 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
32420 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
32430 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
32440 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
32450 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  ( pCell+info.iOv
32460 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65  erflow+3 > pPage
32470 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
32480 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
32490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
324a0 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
324b0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
324c0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
324d0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
324e0 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
324f0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
32500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
32510 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
32520 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
32530 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
32540 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
32550 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
32560 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
32570 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
32580 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
32590 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
325a0 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
325b0 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66  RRUPT_DB && (inf
325c0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66  o.nPayload + ovf
325d0 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50  lPageSize)<ovflP
325e0 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20  ageSize).  );.  
325f0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
32600 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
32610 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
32620 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
32630 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
32640 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
32650 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
32660 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
32670 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
32680 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
32690 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
326a0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
326b0 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
326c0 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
326d0 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
326e0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
326f0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
32700 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
32710 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
32720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
32730 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32740 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
32750 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
32760 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
32770 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
32780 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
32790 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
327a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
327b0 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
327c0 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
327d0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
327e0 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
327f0 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
32800 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
32810 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
32820 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
32830 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
32840 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
32850 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
32860 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
32870 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
32880 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
32890 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
328a0 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
328b0 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
328c0 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
328d0 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
328e0 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
328f0 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
32900 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
32910 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
32920 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
32930 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
32940 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
32950 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
32960 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
32970 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
32980 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
32990 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
329a0 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
329b0 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
329c0 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
329d0 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
329e0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
329f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
32a00 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
32a10 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
32a20 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
32a30 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
32a40 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
32a50 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
32a60 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
32a70 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
32a80 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
32a90 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
32aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
32ab0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32ac0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
32ad0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
32ae0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
32af0 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
32b00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
32b10 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
32b20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
32b30 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
32b40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
32b50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
32b60 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
32b70 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
32b80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
32b90 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
32ba0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
32bb0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
32bc0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
32bd0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
32be0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
32bf0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
32c00 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
32c10 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
32c20 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
32c30 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
32c40 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
32c50 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
32c60 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
32c70 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
32c80 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
32c90 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
32ca0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
32cb0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
32cc0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
32cd0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
32ce0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
32cf0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
32d00 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
32d10 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
32d20 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
32d30 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
32d40 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
32d50 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
32d60 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
32d70 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
32d80 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
32d90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
32da0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
32db0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
32dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32dd0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
32de0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
32df0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32e00 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
32e10 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
32e20 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
32e30 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
32e40 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
32e50 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
32e60 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
32e70 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
32e80 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
32e90 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32eb0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
32ec0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
32ed0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
32ee0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
32f00 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
32f10 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
32f20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
32f30 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
32f40 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
32f50 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
32f60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
32f70 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
32f80 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
32f90 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
32fa0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
32fb0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
32fc0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
32fd0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
32fe0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
32ff0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
33000 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
33010 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33020 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
33030 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
33040 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
33050 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
33060 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
33070 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
33080 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
33090 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
330a0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
330b0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
330c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
330d0 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
330e0 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
330f0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
33100 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
33110 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
33120 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33130 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
33140 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
33150 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
33160 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
33170 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
33180 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
33190 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
331a0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
331b0 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
331c0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
331d0 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
331e0 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
331f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33200 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20  t( nData==0 );. 
33210 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f     assert( nZero
33220 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65  ==0 );.  }.  nHe
33230 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33240 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
33250 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
33260 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
33270 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69  n the payload si
33280 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ze */.  if( pPag
33290 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
332a0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
332b0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
332c0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
332d0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73    }else{ .    as
332e0 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66  sert( nKey<=0x7f
332f0 66 66 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d  ffffff && pKey!=
33300 30 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  0 );.    nPayloa
33310 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
33320 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
33330 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
33340 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
33350 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
33360 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
33370 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
33380 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
33390 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
333a0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
333b0 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
333c0 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
333d0 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
333e0 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
333f0 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
33400 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
33410 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
33420 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
33430 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
33440 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
33450 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
33460 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
33470 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33480 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
33490 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
334a0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
334b0 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
334c0 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
334d0 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
334e0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
334f0 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
33500 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
33510 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
33520 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
33530 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
33540 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
33550 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
33560 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
33570 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
33580 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
33590 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
335a0 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
335b0 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
335c0 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
335d0 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
335e0 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
335f0 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
33600 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
33610 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
33620 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
33630 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
33640 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33660 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
33670 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
33680 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
33690 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
336a0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
336b0 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
336c0 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
336d0 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
336e0 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
336f0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
33700 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
33710 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
33720 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
33730 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
33740 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
33750 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
33760 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
33770 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
33780 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
33790 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
337a0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
337b0 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
337c0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
337d0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
337e0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
337f0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
33800 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e  nHeader=(int)(in
33810 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
33820 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
33830 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
33840 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
33850 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
33860 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
33870 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
33880 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
33890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
338a0 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c  pPrior == &pCell
338b0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
338c0 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
338d0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
338e0 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
338f0 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
33900 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
33910 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
33920 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
33930 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
33940 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
33950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33970 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
33980 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
33990 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
339a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
339b0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
339c0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
339d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
339e0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
339f0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
33a00 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
33a10 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
33a20 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
33a30 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
33a40 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33a50 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
33a60 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
33a70 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
33a80 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
33a90 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
33aa0 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
33ab0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
33ac0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
33ad0 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
33ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
33af0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
33b00 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
33b10 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
33b20 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
33b30 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
33b40 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
33b50 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
33b60 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
33b70 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
33b80 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
33b90 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
33ba0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
33bb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
33bc0 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
33bd0 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
33be0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
33bf0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
33c00 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
33c10 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
33c20 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
33c30 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
33c40 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
33c50 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
33c60 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
33c70 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
33c80 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
33c90 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
33ca0 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
33cb0 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
33cc0 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
33cd0 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
33ce0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
33cf0 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
33d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33d10 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
33d20 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
33d30 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
33d40 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
33d50 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
33d60 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
33d70 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
33d80 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
33d90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
33da0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
33db0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
33dc0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
33dd0 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
33de0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
33df0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
33e00 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
33e10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
33e20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
33e30 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
33e40 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
33e50 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
33e60 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
33e70 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
33e80 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
33e90 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
33ea0 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
33eb0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
33ec0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
33ed0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33ee0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
33ef0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
33f00 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
33f10 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
33f20 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
33f30 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
33f40 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
33f50 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
33f60 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
33f70 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
33f80 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
33f90 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
33fa0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
33fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33fc0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33fd0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
33fe0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
33ff0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34000 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
34010 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34020 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
34030 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
34040 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
34050 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
34060 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
34070 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
34080 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
34090 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
340a0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
340b0 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
340c0 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
340d0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
340e0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
340f0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
34100 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
34110 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
34120 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
34130 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
34140 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34150 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
34160 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
34170 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
34180 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
34190 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
341a0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
341b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
341c0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
341d0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
341e0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
341f0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
34200 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34210 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34220 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34230 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
34240 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
34250 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
34260 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
34270 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
34280 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34290 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
342a0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
342b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
342c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
342d0 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
342e0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
342f0 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
34300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
34310 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
34320 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
34330 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
34340 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
34350 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
34360 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
34370 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
34380 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
34390 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
343a0 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
343b0 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
343c0 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
343d0 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
343e0 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
343f0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
34400 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
34410 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
34420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
34440 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
34450 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
34460 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
34470 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
34480 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
34490 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
344a0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
344b0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
344c0 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
344d0 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
344e0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
344f0 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
34500 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
34510 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
34520 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
34530 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
34540 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
34550 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
34560 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
34570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
34580 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
34590 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
345a0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
345b0 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
345c0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
345d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
345e0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
345f0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
34600 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
34610 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
34620 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
34630 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
34640 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
34650 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
34660 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
34670 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
34680 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
34690 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
346a0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
346b0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
346c0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
346d0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
346e0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
346f0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
34700 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
34710 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
34720 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53  _DB || sz==cellS
34730 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
34740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
34750 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34760 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
34770 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
34780 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
34790 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
347a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
347b0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
347c0 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
347d0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
347e0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
347f0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
34800 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
34810 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
34820 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
34830 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
34840 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
34850 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
34860 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
34870 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
34880 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
34890 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
348a0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
348b0 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
348c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
348d0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
348e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
348f0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
34900 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
34910 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
34920 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
34930 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
34940 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
34950 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
34960 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
34970 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
34980 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
34990 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
349a0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
349b0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
349c0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
349d0 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
349e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
349f0 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
34a00 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
34a10 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
34a20 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
34a30 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
34a40 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
34a50 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
34a60 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
34a70 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
34a80 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
34a90 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
34aa0 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
34ab0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
34ac0 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
34ad0 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
34ae0 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
34af0 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
34b00 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
34b10 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
34b20 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
34b30 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
34b40 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
34b50 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
34b60 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
34b70 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
34b80 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
34b90 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
34ba0 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
34bb0 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
34bc0 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
34bd0 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
34be0 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
34bf0 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
34c00 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
34c10 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
34c20 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
34c30 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
34c40 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
34c50 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
34c60 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
34c70 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
34c80 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
34c90 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
34ca0 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
34cb0 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
34cc0 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mented..*/.stati
34cd0 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
34ce0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
34cf0 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
34d00 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
34d10 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
34d20 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
34d30 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
34d40 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
34d50 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
34d60 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
34d70 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
34d80 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
34d90 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
34da0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
34db0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
34dc0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
34dd0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
34de0 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
34df0 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
34e00 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
34e10 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
34e20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
34e30 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
34e40 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
34e50 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
34e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
34e70 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
34e80 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
34e90 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
34ea0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
34eb0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
34ec0 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
34ed0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
34ee0 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
34ef0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
34f00 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
34f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
34f20 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
34f30 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
34f40 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f  *pIns;         /
34f50 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70  * The point in p
34f60 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d  Page->aCellIdx[]
34f70 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69   where no cell i
34f80 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66  nserted */..  if
34f90 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
34fa0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
34fb0 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
34fc0 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
34fd0 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
34fe0 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  ( MX_CELL(pPage-
34ff0 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
35000 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
35010 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28  >nCell<=MX_CELL(
35020 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43  pPage->pBt) || C
35030 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
35040 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
35050 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69  verflow<=ArraySi
35060 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
35070 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41  ) );.  assert( A
35080 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
35090 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69  apOvfl)==ArraySi
350a0 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  ze(pPage->aiOvfl
350b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
350c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
350d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
350e0 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
350f0 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
35100 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
35110 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
35120 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
35130 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
35140 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
35150 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
35160 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
35170 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
35180 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
35190 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
351a0 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
351b0 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
351c0 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
351d0 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
351e0 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
351f0 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
35200 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
35210 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
35220 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
35230 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
35240 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
35250 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50    assert( sz==pP
35260 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
35270 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
35280 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
35290 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
352a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
352b0 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
352c0 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
352d0 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
352e0 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c  cpy(pTemp, pCell
352f0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65  , sz);.      pCe
35300 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
35310 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
35320 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
35330 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
35340 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
35350 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35360 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
35370 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
35380 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
35390 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
353a0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
353b0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
353c0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
353d0 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
353e0 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
353f0 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
35400 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
35410 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
35420 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
35430 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
35440 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
35450 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
35460 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
35470 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
35480 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
35490 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
354a0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
354b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
354c0 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
354d0 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
354e0 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
354f0 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
35500 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
35510 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
35520 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
35530 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
35540 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
35550 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
35560 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
35570 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  i==pPage->aiOvfl
35580 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20  [j-1]+1 );   /* 
35590 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65  Overflows are se
355a0 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65  quential */.  }e
355b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
355c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
355d0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
355e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
355f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35600 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
35610 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
35620 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
35630 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35640 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35650 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
35660 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
35670 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  a;.    assert( &
35680 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
35690 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e  Offset]==pPage->
356a0 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20  aCellIdx );.    
356b0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
356c0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
356d0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
356e0 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
356f0 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
35700 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
35710 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
35720 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
35730 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20  ing properties. 
35740 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75     ** if it retu
35750 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
35760 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35770 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  idx >= 0 );.    
35780 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70  assert( idx >= p
35790 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
357a0 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  +2*pPage->nCell+
357b0 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  2 || CORRUPT_DB 
357c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
357d0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
357e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
357f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
35800 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
35810 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
35820 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d  emcpy(&data[idx]
35830 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20  , pCell, sz);.  
35840 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
35850 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
35860 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
35870 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
35880 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c  ns = pPage->aCel
35890 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20  lIdx + i*2;.    
358a0 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20  memmove(pIns+2, 
358b0 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e  pIns, 2*(pPage->
358c0 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20  nCell - i));.   
358d0 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20   put2byte(pIns, 
358e0 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  idx);.    pPage-
358f0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a  >nCell++;.    /*
35900 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63   increment the c
35910 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  ell count */.   
35920 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61   if( (++data[pPa
35930 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d  ge->hdrOffset+4]
35940 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67  )==0 ) data[pPag
35950 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b  e->hdrOffset+3]+
35960 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  +;.    assert( g
35970 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  et2byte(&data[pP
35980 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
35990 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])==pPage->nCell
359a0 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
359b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
359c0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
359d0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
359e0 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
359f0 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
35a00 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
35a10 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
35a20 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
35a30 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
35a40 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
35a50 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
35a60 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
35a70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
35a80 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
35a90 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
35aa0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
35ab0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65   }.}../*.** A Ce
35ac0 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63  llArray object c
35ad0 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65 20  ontains a cache 
35ae0 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  of pointers and 
35af0 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63  sizes for a.** c
35b00 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75 65  onsecutive seque
35b10 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61  nce of cells tha
35b20 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20  t might be held 
35b30 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
35b40 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
35b50 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
35b60 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
35b70 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
35b80 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
35b90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
35ba0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
35bb0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
35bc0 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
35bd0 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
35be0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
35bf0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
35c00 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
35c10 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
35c20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
35c30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
35c40 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
35c50 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
35c60 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
35c70 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
35c80 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
35c90 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
35ca0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
35cb0 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
35cc0 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
35cd0 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
35ce0 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
35cf0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
35d00 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
35d10 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
35d20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
35d30 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
35d40 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
35d50 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
35d60 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
35d70 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
35d80 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
35d90 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
35da0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
35db0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35dc0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
35dd0 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
35de0 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
35df0 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
35e00 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
35e10 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
35e20 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
35e30 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
35e40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
35e50 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
35e60 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
35e70 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
35e80 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
35e90 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
35ea0 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
35eb0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
35ec0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
35ed0 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
35ee0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
35ef0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
35f00 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
35f10 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
35f20 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
35f30 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
35f40 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
35f50 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
35f60 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
35f70 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
35f80 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
35f90 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
35fa0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
35fb0 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
35fc0 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
35fd0 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
35fe0 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
35ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
36000 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
36010 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
36020 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
36030 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
36040 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
36050 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
36060 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
36070 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
36080 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
36090 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
360a0 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
360b0 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
360c0 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
360d0 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
360e0 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
360f0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
36100 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
36110 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
36120 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
36130 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
36140 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
36150 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
36160 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
36170 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
36180 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
36190 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
361a0 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
361b0 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
361c0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
361d0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
361e0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
361f0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
36200 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
36210 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
36220 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
36230 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
36240 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
36250 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
36260 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
36270 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
36280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36290 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
362a0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
362b0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
362c0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
362d0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
362e0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
362f0 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
36300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36310 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
36320 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
36330 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
36340 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
36350 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
36360 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
36370 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
36380 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
36390 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
363a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
363b0 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
363c0 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
363d0 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
363e0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
363f0 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
36400 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
36410 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
36420 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
36430 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
36440 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
36450 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
36460 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
36470 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
36480 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
36490 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
364a0 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
364b0 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
364c0 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
364d0 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
364e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
364f0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
36500 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
36510 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
36520 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  l>aData && pCell
36530 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  <pEnd ){.      p
36540 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
36550 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
36560 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20   }.    pData -= 
36570 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70  szCell[i];.    p
36580 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
36590 2c 20 28 70 44 61 74 61 20 2d 20 61 44 61 74 61  , (pData - aData
365a0 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  ));.    pCellptr
365b0 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70   += 2;.    if( p
365c0 44 61 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20  Data < pCellptr 
365d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
365e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
365f0 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
36600 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d  pCell, szCell[i]
36610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
36620 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78  zCell[i]==pPg->x
36630 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43  CellSize(pPg, pC
36640 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
36650 44 42 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  DB );.    testca
36660 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70  se( szCell[i]!=p
36670 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  Pg->xCellSize(pP
36680 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a  g,pCell) );.  }.
36690 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e  .  /* The pPg->n
366a0 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f  Free field is no
366b0 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c  w set incorrectl
366c0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  y. The caller wi
366d0 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20  ll fix it. */.  
366e0 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65  pPg->nCell = nCe
366f0 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72  ll;.  pPg->nOver
36700 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74  flow = 0;..  put
36710 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
36720 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62  +1], 0);.  put2b
36730 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
36740 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
36750 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
36760 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
36770 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74  - aData);.  aDat
36780 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b  a[hdr+7] = 0x00;
36790 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
367a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  _OK;.}../*.** Ar
367b0 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
367c0 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e  tains nCell poin
367d0 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63  ters to b-tree c
367e0 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65  ells. Array szCe
367f0 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  ll.** contains t
36800 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
36810 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
36820 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36830 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a  n attempts to .*
36840 2a 20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20  * add the cells 
36850 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72  stored in the ar
36860 72 61 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e  ray to page pPg.
36870 20 49 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62   If it cannot (b
36880 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70  ecause .** the p
36890 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
368a0 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66  defragmented bef
368b0 6f 72 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69  ore the cells wi
368c0 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72  ll fit), non-zer
368d0 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  o.** is returned
368e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
368f0 74 68 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64  the cells are ad
36900 64 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ded successfully
36910 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74  , zero is.** ret
36920 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  urned..**.** Arg
36930 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70  ument pCellptr p
36940 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
36950 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
36960 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
36970 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70  ay.** (part of p
36980 61 67 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75  age pPg) to popu
36990 6c 61 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c  late. After cell
369a0 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72   apCell[0] is wr
369b0 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
369c0 70 61 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d  page body, a 16-
369d0 62 69 74 20 6f 66 66 73 65 74 20 69 73 20 77 72  bit offset is wr
369e0 69 74 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74  itten to pCellpt
369f0 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f  r. And so on, fo
36a00 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69  r each.** cell i
36a10 6e 20 74 68 65 20 61 72 72 61 79 2e 20 49 74 20  n the array. It 
36a20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
36a30 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
36a40 6c 65 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a  ler to ensure.**
36a50 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
36a60 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68   to overwrite th
36a70 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  is part of the c
36a80 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61  ell-pointer arra
36a90 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  y..**.** When th
36aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
36ab0 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70  alled, *ppData p
36ac0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
36ad0 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f  rt of the .** co
36ae0 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61  ntent area on pa
36af0 67 65 20 70 50 67 2e 20 49 66 20 74 68 65 20 73  ge pPg. If the s
36b00 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65  ize of the conte
36b10 6e 74 20 61 72 65 61 20 69 73 20 65 78 74 65 6e  nt area is exten
36b20 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20  ded,.** *ppData 
36b30 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f  is updated to po
36b40 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73  int to the new s
36b50 74 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74  tart of the cont
36b60 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f  ent area.** befo
36b70 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
36b80 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67  .** Finally, arg
36b90 75 6d 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69  ument pBegin poi
36ba0 6e 74 73 20 74 6f 20 74 68 65 20 62 79 74 65 20  nts to the byte 
36bb0 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
36bc0 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64  owing the.** end
36bd0 20 6f 66 20 74 68 65 20 73 70 61 63 65 20 72 65   of the space re
36be0 71 75 69 72 65 64 20 62 79 20 74 68 69 73 20 70  quired by this p
36bf0 61 67 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c  age for the cell
36c00 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66  -pointer area (f
36c10 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20  or.** all cells 
36c20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65  - not just those
36c30 20 69 6e 73 65 72 74 65 64 20 62 79 20 74 68 65   inserted by the
36c40 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20   current call). 
36c50 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  If the content.*
36c60 2a 20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65  * area must be e
36c70 78 74 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72  xtended to befor
36c80 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
36c90 6f 72 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64  order to accomod
36ca0 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  ate all.** cells
36cb0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68   in apCell[], th
36cc0 65 6e 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20  en the cells do 
36cd0 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d  not fit and non-
36ce0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
36cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36d00 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
36d10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64     /* Page to ad
36d40 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20  d cells to */.  
36d50 75 38 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  u8 *pBegin,     
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d70 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70  /* End of cell-p
36d80 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
36d90 20 20 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20    u8 **ppData,  
36da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36db0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67    /* IN/OUT: Pag
36dc0 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20  e content -area 
36dd0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
36de0 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20  *pCellptr,      
36df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36e00 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d  Pointer to cell-
36e10 70 6f 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a  pointer area */.
36e20 20 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20    int iFirst,   
36e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e40 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
36e50 72 73 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20  rst cell to add 
36e60 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
36e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36e90 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
36ea0 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41  o pPg */.  CellA
36eb0 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
36ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
36ed0 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
36ee0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ){.  int i;.  u8
36ef0 20 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61   *aData = pPg->a
36f00 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74  Data;.  u8 *pDat
36f10 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69  a = *ppData;.  i
36f20 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74  nt iEnd = iFirst
36f30 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65   + nCell;.  asse
36f40 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
36f50 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  | pPg->hdrOffset
36f60 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76  ==0 );    /* Nev
36f70 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  er called on pag
36f80 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69  e 1 */.  for(i=i
36f90 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69  First; i<iEnd; i
36fa0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c  ++){.    int sz,
36fb0 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c   rc;.    u8 *pSl
36fc0 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63  ot;.    sz = cac
36fd0 68 65 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72  hedCellSize(pCAr
36fe0 72 61 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  ray, i);.    if(
36ff0 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26   (aData[1]==0 &&
37000 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c   aData[2]==0) ||
37010 20 28 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69   (pSlot = pageFi
37020 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72  ndSlot(pPg,sz,&r
37030 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  c))==0 ){.      
37040 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20  pData -= sz;.   
37050 20 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65     if( pData<pBe
37060 67 69 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  gin ) return 1;.
37070 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44        pSlot = pD
37080 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ata;.    }.    m
37090 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20 70 43 41  emcpy(pSlot, pCA
370a0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c  rray->apCell[i],
370b0 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79   sz);.    put2by
370c0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53  te(pCellptr, (pS
370d0 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20  lot - aData));. 
370e0 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32     pCellptr += 2
370f0 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20  ;.  }.  *ppData 
37100 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72  = pData;.  retur
37110 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  n 0;.}../*.** Ar
37120 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
37130 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e  tains nCell poin
37140 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63  ters to b-tree c
37150 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65  ells. Array szCe
37160 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ll .** contains 
37170 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
37180 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63  s of each such c
37190 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
371a0 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73  on adds the.** s
371b0 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20  pace associated 
371c0 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69  with each cell i
371d0 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74  n the array that
371e0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
371f0 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20  ored .** within 
37200 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20  the body of pPg 
37210 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d  to the pPg free-
37220 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70  list. The cell-p
37230 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65  ointers and othe
37240 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74  r.** fields of t
37250 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20  he page are not 
37260 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  updated..**.** T
37270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
37280 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  urns the total n
37290 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61  umber of cells a
372a0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
372b0 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  -list..*/.static
372c0 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72   int pageFreeArr
372d0 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
372e0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
372f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37300 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69   edit */.  int i
37310 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
37320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
37330 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65  rst cell to dele
37340 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  te */.  int nCel
37350 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37360 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73          /* Cells
37370 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
37380 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72  CellArray *pCArr
37390 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ay              
373a0 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c  /* Array of cell
373b0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
373c0 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
373d0 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
373e0 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
373f0 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73  ata[pPg->pBt->us
37400 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20  ableSize];.  u8 
37410 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d  * const pStart =
37420 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72   &aData[pPg->hdr
37430 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67  Offset + 8 + pPg
37440 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
37450 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b  .  int nRet = 0;
37460 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
37470 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20  iEnd = iFirst + 
37480 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72  nCell;.  u8 *pFr
37490 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a  ee = 0;.  int sz
374a0 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Free = 0;..  for
374b0 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e  (i=iFirst; i<iEn
374c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  d; i++){.    u8 
374d0 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79  *pCell = pCArray
374e0 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  ->apCell[i];.   
374f0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74 61   if( pCell>=pSta
37500 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64  rt && pCell<pEnd
37510 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   ){.      int sz
37520 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ;.      /* No ne
37530 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65 64  ed to use cached
37540 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65 2e  CellSize() here.
37550 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20 61    The sizes of a
37560 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20 20  ll cells that.  
37570 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62 65      ** are to be
37580 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72 65   freed have alre
37590 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74 69  ady been computi
375a0 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69 6e  ng while decidin
375b0 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a  g which.      **
375c0 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65 65   cells need free
375d0 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20  ing */.      sz 
375e0 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c  = pCArray->szCel
375f0 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20 73  l[i];  assert( s
37600 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  z>0 );.      if(
37610 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b   pFree!=(pCell +
37620 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20 20   sz) ){.        
37630 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
37640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
37650 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28 70  Free>aData && (p
37660 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35  Free - aData)<65
37670 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20 20  536 );.         
37680 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20   freeSpace(pPg, 
37690 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44  (u16)(pFree - aD
376a0 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20  ata), szFree);. 
376b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
376c0 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
376d0 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 3d          szFree =
376e0 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66 28   sz;.        if(
376f0 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29   pFree+sz>pEnd )
37700 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
37710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37720 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20  pFree = pCell;. 
37730 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b 3d         szFree +=
37740 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
37750 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d     nRet++;.    }
37760 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65 65  .  }.  if( pFree
37770 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37780 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
37790 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
377a0 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65 65  5536 );.    free
377b0 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
377c0 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
377d0 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20   szFree);.  }.  
377e0 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a  return nRet;.}..
377f0 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61  /*.** apCell[] a
37800 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74  nd szCell[] cont
37810 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
37820 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61 6c   and sizes of al
37830 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a  l cells in the.*
37840 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  * pages being ba
37850 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75 72  lanced.  The cur
37860 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c 20  rent page, pPg, 
37870 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63  has pPg->nCell c
37880 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ells starting.**
37890 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c   with apCell[iOl
378a0 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61 6e  d].  After balan
378b0 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65 20  cing, this page 
378c0 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77  should hold nNew
378d0 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69   cells.** starti
378e0 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65  ng at apCell[iNe
378f0 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  w]..**.** This r
37900 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68 65  outine makes the
37910 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
37920 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73 6f  tments to pPg so
37930 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
37940 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  s.** the correct
37950 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65 69   cells after bei
37960 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a  ng balanced..**.
37970 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65  ** The pPg->nFre
37980 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
37990 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  id when this fun
379a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
379b0 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73 70  t is the.** resp
379c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
379d0 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20  e caller to set 
379e0 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  it correctly..*/
379f0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69 74  .static int edit
37a00 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
37a10 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20  *pPg,           
37a20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20          /* Edit 
37a30 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69  this page */.  i
37a40 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20 20  nt iOld,        
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a60 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
37a70 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20   cell currently 
37a80 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  on page */.  int
37a90 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20 20   iNew,          
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37ab0 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69 72  Index of new fir
37ac0 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20  st cell on page 
37ad0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20  */.  int nNew,  
37ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37af0 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75       /* Final nu
37b00 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
37b10 20 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41   page */.  CellA
37b20 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
37b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
37b40 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64  ray of cells and
37b50 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   sizes */.){.  u
37b60 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
37b70 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
37b80 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
37b90 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  pPg->hdrOffset;.
37ba0 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26    u8 *pBegin = &
37bb0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e  pPg->aCellIdx[nN
37bc0 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e  ew * 2];.  int n
37bd0 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c  Cell = pPg->nCel
37be0 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  l;       /* Cell
37bf0 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20  s stored on pPg 
37c00 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  */.  u8 *pData;.
37c10 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a    u8 *pCellptr;.
37c20 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
37c30 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20  OldEnd = iOld + 
37c40 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67  pPg->nCell + pPg
37c50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
37c60 6e 74 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65  nt iNewEnd = iNe
37c70 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65  w + nNew;..#ifde
37c80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
37c90 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69   u8 *pTmp = sqli
37ca0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
37cb0 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67  e(pPg->pBt->pPag
37cc0 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  er);.  memcpy(pT
37cd0 6d 70 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e  mp, aData, pPg->
37ce0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
37cf0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  ;.#endif..  /* R
37d00 65 6d 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d  emove cells from
37d10 20 74 68 65 20 73 74 61 72 74 20 61 6e 64 20 65   the start and e
37d20 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
37d30 2f 0a 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65  /.  if( iOld<iNe
37d40 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68  w ){.    int nSh
37d50 69 66 74 20 3d 20 70 61 67 65 46 72 65 65 41 72  ift = pageFreeAr
37d60 72 61 79 28 70 50 67 2c 20 69 4f 6c 64 2c 20 69  ray(pPg, iOld, i
37d70 4e 65 77 2d 69 4f 6c 64 2c 20 70 43 41 72 72 61  New-iOld, pCArra
37d80 79 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  y);.    memmove(
37d90 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 2c 20 26  pPg->aCellIdx, &
37da0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 53  pPg->aCellIdx[nS
37db0 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32  hift*2], nCell*2
37dc0 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20  );.    nCell -= 
37dd0 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20 20 69 66  nShift;.  }.  if
37de0 28 20 69 4e 65 77 45 6e 64 20 3c 20 69 4f 6c 64  ( iNewEnd < iOld
37df0 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43 65 6c 6c  End ){.    nCell
37e00 20 2d 3d 20 70 61 67 65 46 72 65 65 41 72 72 61   -= pageFreeArra
37e10 79 28 70 50 67 2c 20 69 4e 65 77 45 6e 64 2c 20  y(pPg, iNewEnd, 
37e20 69 4f 6c 64 45 6e 64 20 2d 20 69 4e 65 77 45 6e  iOldEnd - iNewEn
37e30 64 2c 20 70 43 41 72 72 61 79 29 3b 0a 20 20 7d  d, pCArray);.  }
37e40 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44 61  ..  pData = &aDa
37e50 74 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ta[get2byteNotZe
37e60 72 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  ro(&aData[hdr+5]
37e70 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 3c  )];.  if( pData<
37e80 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65 64  pBegin ) goto ed
37e90 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20  itpage_fail;..  
37ea0 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f 20  /* Add cells to 
37eb0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37ec0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69   page */.  if( i
37ed0 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20 20  New<iOld ){.    
37ee0 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28 6e  int nAdd = MIN(n
37ef0 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a  New,iOld-iNew);.
37f00 20 20 20 20 61 73 73 65 72 74 28 20 28 69 4f 6c      assert( (iOl
37f10 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c 20  d-iNew)<nNew || 
37f20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52  nCell==0 || CORR
37f30 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70 43  UPT_DB );.    pC
37f40 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
37f50 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d 6d  ellIdx;.    memm
37f60 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e 41  ove(&pCellptr[nA
37f70 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  dd*2], pCellptr,
37f80 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20 69   nCell*2);.    i
37f90 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  f( pageInsertArr
37fa0 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ay(.          pP
37fb0 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
37fc0 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
37fd0 20 20 20 20 20 20 20 69 4e 65 77 2c 20 6e 41 64         iNew, nAd
37fe0 64 2c 20 70 43 41 72 72 61 79 0a 20 20 20 20 29  d, pCArray.    )
37ff0 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
38000 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c  _fail;.    nCell
38010 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20   += nAdd;.  }.. 
38020 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72   /* Add any over
38030 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  flow cells */.  
38040 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e  for(i=0; i<pPg->
38050 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b  nOverflow; i++){
38060 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d  .    int iCell =
38070 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69   (iOld + pPg->ai
38080 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b  Ovfl[i]) - iNew;
38090 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d  .    if( iCell>=
380a0 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20  0 && iCell<nNew 
380b0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74  ){.      pCellpt
380c0 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
380d0 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20  dx[iCell * 2];. 
380e0 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43       memmove(&pC
380f0 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c  ellptr[2], pCell
38100 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43  ptr, (nCell - iC
38110 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20  ell) * 2);.     
38120 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
38130 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
38140 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  ray(.           
38150 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
38160 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
38170 20 20 20 20 20 20 20 20 20 20 20 20 69 43 65 6c              iCel
38180 6c 2b 69 4e 65 77 2c 20 31 2c 20 70 43 41 72 72  l+iNew, 1, pCArr
38190 61 79 0a 20 20 20 20 20 20 29 20 29 20 67 6f 74  ay.      ) ) got
381a0 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
381b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
381c0 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74 6f   Append cells to
381d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
381e0 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c 70  page */.  pCellp
381f0 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c  tr = &pPg->aCell
38200 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20  Idx[nCell*2];.  
38210 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
38220 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50 67  ray(.        pPg
38230 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
38240 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
38250 20 20 20 20 69 4e 65 77 2b 6e 43 65 6c 6c 2c 20      iNew+nCell, 
38260 6e 4e 65 77 2d 6e 43 65 6c 6c 2c 20 70 43 41 72  nNew-nCell, pCAr
38270 72 61 79 0a 20 20 29 20 29 20 67 6f 74 6f 20 65  ray.  ) ) goto e
38280 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20  ditpage_fail;.. 
38290 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e   pPg->nCell = nN
382a0 65 77 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72  ew;.  pPg->nOver
382b0 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74  flow = 0;..  put
382c0 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
382d0 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
382e0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
382f0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
38300 61 20 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66  a - aData);..#if
38310 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
38320 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
38330 65 77 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44  ew && !CORRUPT_D
38340 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  B; i++){.    u8 
38350 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79  *pCell = pCArray
38360 2d 3e 61 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d  ->apCell[i+iNew]
38370 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  ;.    int iOff =
38380 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
38390 28 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&pPg->aCellIdx[
383a0 69 2a 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  i*2]);.    if( p
383b0 43 65 6c 6c 3e 3d 61 44 61 74 61 20 26 26 20 70  Cell>=aData && p
383c0 43 65 6c 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d  Cell<&aData[pPg-
383d0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
383e0 5d 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ] ){.      pCell
383f0 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d   = &pTmp[pCell -
38400 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20   aData];.    }. 
38410 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65     assert( 0==me
38420 6d 63 6d 70 28 70 43 65 6c 6c 2c 20 26 61 44 61  mcmp(pCell, &aDa
38430 74 61 5b 69 4f 66 66 5d 2c 0a 20 20 20 20 20 20  ta[iOff],.      
38440 20 20 20 20 20 20 70 43 41 72 72 61 79 2d 3e 70        pCArray->p
38450 52 65