/ Hex Artifact Content
Login

Artifact 38ed0262d1c66d21bb084f086650e6106ae43d98:


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 2f 2a 0a 2a 2a 20   = -1;.}../*.** 
4ef0: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
4f00: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4f10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
4f20: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
4f30: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
4f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4f50: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
4f60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f70: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
4f80: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
4f90: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
4fa0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
4fb0: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
4fc0: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
4fd0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4fe0: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
4ff0: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5000: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5010: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5020: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5030: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5040: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5050: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
5060: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
5070: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
5080: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
5090: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
50a0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
50b0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
50c0: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
50d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
50e0: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
50f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5100: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5110: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5120: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5130: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5150: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
5160: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5180: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5190: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
51a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
51b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
51c0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
51d0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
51e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5200: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5210: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
5230: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
5240: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
5250: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
5260: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
5270: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
5280: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
5290: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
52a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
52b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
52c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
52d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
52e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
52f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
5300: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
5310: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
5320: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
5330: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
5340: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
5350: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
5360: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
5370: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
5380: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
5390: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
53a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
53b0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
53c0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
53d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
53e0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
53f0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5400: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5430: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5460: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5470: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5480: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
54a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
54b0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
54c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
54d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
54e0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
54f0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5510: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5520: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5530: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5540: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5550: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5560: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5570: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5580: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
5590: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
55a0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
55b0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
55c0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
55d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
55f0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5620: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5630: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5640: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5650: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5660: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5670: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5680: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5690: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
56a0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
56b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
56d0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5700: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5710: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5720: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5750: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5760: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5770: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5780: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5790: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61  EEK;.  }..  inva
57a0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
57b0: 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  che(pCur);.  ret
57c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
57d0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
57e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
57f0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5800: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5810: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5820: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5830: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5840: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5850: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5860: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5870: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5880: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5890: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
58a0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
58b0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
58c0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
58d0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
58e0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
58f0: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5900: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5910: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5920: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5930: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5940: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5950: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5960: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5970: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5980: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5990: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
59a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
59b0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
59c0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
59d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
59e0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
59f0: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5a00: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5a10: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5a20: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5a30: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5a40: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5a50: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5a60: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5a70: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5a80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5a90: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5aa0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5ab0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5ac0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ad0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5ae0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5af0: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5b00: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5b10: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5b20: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5b30: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5b40: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5b50: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5b60: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5b70: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5b80: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5b90: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5ba0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5bb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5bc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5bd0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5be0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5bf0: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5c00: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5c10: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5c20: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5c30: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5c40: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5c50: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5c60: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5c80: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5c90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5ca0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5cb0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5cc0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5cd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5cf0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5d00: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5d10: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5d20: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5d30: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5d40: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5d50: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5d60: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5d70: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5d80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5d90: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5da0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5db0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5dc0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5dd0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5de0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
5df0: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
5e00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5e10: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
5e20: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
5e30: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
5e40: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
5e50: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
5e60: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
5e70: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
5e80: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
5e90: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
5ea0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
5eb0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
5ec0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
5ed0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
5ee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
5ef0: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
5f00: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
5f10: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
5f20: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
5f30: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
5f40: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
5f50: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
5f60: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
5f70: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
5f80: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
5f90: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
5fa0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
5fb0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
5fc0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
5fd0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
5fe0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
5ff0: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6000: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6010: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6020: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6030: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6040: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6050: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6060: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6070: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6080: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6090: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
60a0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
60b0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
60c0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
60d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
60e0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
60f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6130: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6140: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6150: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6160: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6170: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6180: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
6190: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
61a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
61b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
61c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
61d0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
61e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
61f0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6200: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6210: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6220: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6230: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6240: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6250: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6260: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6270: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
6290: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
62a0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
62b0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
62c0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
62d0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
62e0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
62f0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6300: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6310: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6320: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6330: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6340: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6350: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6360: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6370: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6380: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
6390: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
63a0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
63b0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
63c0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
63d0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
63e0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
63f0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6400: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6410: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6420: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6430: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6450: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6460: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6470: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6480: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
6490: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
64a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
64d0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
64e0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
64f0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6500: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6510: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
6520: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6530: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6540: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6550: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6560: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6570: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6580: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
6590: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
65a0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
65b0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
65c0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
65d0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
65e0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
65f0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6600: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6610: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6630: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6640: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6650: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6660: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6670: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6680: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6690: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
66a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
66b0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
66c0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
66d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
66e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
66f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
6700: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
6710: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6720: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6730: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6740: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6750: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6770: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6780: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
67a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
67b0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
67c0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
67d0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
67e0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
67f0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
6800: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6810: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
6820: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6830: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6840: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6850: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6860: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6870: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6880: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6890: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
68a0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
68b0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
68c0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
68d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
68e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
68f0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6900: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6910: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6920: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
6930: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
6940: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6950: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6960: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6970: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6980: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6990: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
69a0: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
69b0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
69c0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
69d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
69e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
69f0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6a00: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6a10: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6a20: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6a30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6a50: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6a60: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6a70: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6a80: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6a90: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6aa0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6ab0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6ac0: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6ad0: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6ae0: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6af0: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6b00: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6b10: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6b20: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6b30: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6b50: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6b60: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6b70: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6b80: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6b90: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6ba0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6bb0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6bc0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6bd0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6be0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6bf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6c00: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6c10: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6c20: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6c30: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6c40: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6c50: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6c60: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6c70: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6c80: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6c90: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6ca0: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6cb0: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6cc0: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6cd0: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6ce0: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6cf0: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6d00: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6d10: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6d20: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6d30: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
6d40: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
6d50: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
6d60: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
6d70: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
6d80: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
6d90: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
6da0: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
6db0: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
6dc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6dd0: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
6de0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6df0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
6e00: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
6e10: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
6e20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6e40: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
6e50: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
6e60: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
6e70: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
6e80: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
6e90: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
6ea0: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
6eb0: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
6ec0: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
6ed0: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
6ee0: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
6ef0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
6f00: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
6f10: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
6f20: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
6f30: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
6f40: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
6f50: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
6f60: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
6f70: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
6f80: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
6f90: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
6fa0: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
6fb0: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
6fc0: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
6fd0: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
6fe0: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
6ff0: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
7000: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
7010: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
7020: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
7030: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
7040: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
7050: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
7060: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
7070: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7080: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7090: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
70a0: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
70b0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
70c0: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
70d0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
70e0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
70f0: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
7100: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7110: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
7120: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
7130: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7140: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7150: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
7160: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7170: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
7180: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7190: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
71a0: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
71b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
71c0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
71d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
71e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
71f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7200: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
7210: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
7220: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
7230: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
7240: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
7250: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
7260: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
7270: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
7280: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
7290: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
72a0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
72b0: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
72c0: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
72d0: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
72e0: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
72f0: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
7300: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
7310: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
7320: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
7330: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
7340: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
7350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
7360: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
7370: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
7380: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
7390: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
73a0: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
73b0: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
73c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
73d0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
73e0: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
73f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
7400: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
7410: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
7420: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
7430: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
7440: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
7450: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
7460: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
7470: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
7480: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
7490: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
74a0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
74b0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
74c0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
74d0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
74e0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
74f0: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
7500: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7510: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7520: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
7530: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
7540: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
7550: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
7560: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
7570: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
7580: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
7590: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
75a0: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
75b0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
75c0: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
75d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
75e0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
75f0: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
7600: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
7610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
7620: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
7630: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
7640: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
7650: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
7660: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
7670: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
7680: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7690: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
76a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
76b0: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
76c0: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
76d0: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
76e0: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
76f0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
7700: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
7710: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7720: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
7730: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
7740: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
7750: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
7760: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
7770: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
7780: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7790: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
77a0: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
77b0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
77c0: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
77d0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
77e0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
77f0: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
7800: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
7810: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
7820: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
7830: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
7840: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
7850: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
7860: 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
7870: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7880: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7890: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
78a0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
78b0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
78c0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
78d0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
78e0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
78f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7900: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
7910: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7920: 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  }.  offset = PTR
7930: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
7940: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
7950: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
7960: 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
7970: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7980: 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65     goto ptrmap_e
7990: 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  xit;.  }.  asser
79a0: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
79b0: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
79c0: 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70  e-5 );.  pPtrmap
79d0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
79e0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
79f0: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
7a00: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
7a10: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
7a20: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7a30: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
7a40: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
7a50: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
7a60: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
7a70: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
7a80: 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20  .    *pRC= rc = 
7a90: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
7aa0: 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
7ab0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
7ac0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d  K ){.      pPtrm
7ad0: 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79  ap[offset] = eTy
7ae0: 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  pe;.      put4by
7af0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7b00: 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a  et+1], parent);.
7b10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61      }.  }..ptrma
7b20: 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65  p_exit:.  sqlite
7b30: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7b40: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
7b50: 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f  ead an entry fro
7b60: 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  m the pointer ma
7b70: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
7b80: 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20  utine retrieves 
7b90: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
7ba0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27  entry for page '
7bb0: 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a  key', writing.**
7bc0: 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61   the type and pa
7bd0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7be0: 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20   to *pEType and 
7bf0: 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76  *pPgno respectiv
7c00: 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ely..** An error
7c10: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
7c20: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
7c30: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
7c40: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
7c50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
7c60: 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64  rmapGet(BtShared
7c70: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
7c80: 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e   u8 *pEType, Pgn
7c90: 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50  o *pPgno){.  DbP
7ca0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20  age *pDbPage;   
7cb0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
7cc0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
7cd0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   iPtrmap;       
7ce0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
7cf0: 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75  age index */.  u
7d00: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
7d10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
7d20: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
7d30: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
7d40: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
7d50: 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72  entry in pointer
7d60: 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63   map */.  int rc
7d70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7d80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7d90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
7da0: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7db0: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7dc0: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7dd0: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7de0: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7df0: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7e00: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
7e10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7e20: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
7e30: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
7e40: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
7e50: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7e60: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7e70: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7e80: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7e90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
7ea0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
7eb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7ec0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7ee0: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7ef0: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
7f00: 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21   assert( pEType!
7f10: 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20  =0 );.  *pEType 
7f20: 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  = pPtrmap[offset
7f30: 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29  ];.  if( pPgno )
7f40: 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79   *pPgno = get4by
7f50: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7f60: 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74  et+1]);..  sqlit
7f70: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
7f80: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45  Page);.  if( *pE
7f90: 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70  Type<1 || *pETyp
7fa0: 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e>5 ) return SQL
7fb0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7fc0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7fd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  E_OK;.}..#else /
7fe0: 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c  * if defined SQL
7ff0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8000: 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  UUM */.  #define
8010: 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79   ptrmapPut(w,x,y
8020: 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65  ,z,rc).  #define
8030: 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79   ptrmapGet(w,x,y
8040: 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,z) SQLITE_OK.  
8050: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
8060: 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72  tOvflPtr(x, y, r
8070: 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
8080: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
8090: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
80a0: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
80b0: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
80c0: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
80d0: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
80e0: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
80f0: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
8100: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
8110: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
8120: 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50  ** findCellPastP
8130: 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73 61  tr() does the sa
8140: 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b 69  me except it ski
8150: 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69 74  ps past the init
8160: 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68  ial.** 4-byte ch
8170: 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e  ild pointer foun
8180: 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  d on interior pa
8190: 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69 73  ges, if there is
81a0: 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   one..**.** This
81b0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
81c0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
81d0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
81e0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
81f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
8200: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
8210: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
8220: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8230: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8240: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
8250: 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66  I)]))).#define f
8260: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50  indCellPastPtr(P
8270: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
8280: 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e  ataOfst + ((P)->
8290: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
82a0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
82b0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
82c0: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
82d0: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20   is common tail 
82e0: 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62  processing for b
82f0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8300: 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50  () and.** btreeP
8310: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
8320: 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  () for the case 
8330: 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f  when the cell do
8340: 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72  es not fit entir
8350: 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67  ely.** on a sing
8360: 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20  le B-tree page. 
8370: 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20   Make necessary 
8380: 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74  adjustments to t
8390: 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73  he CellInfo.** s
83a0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
83b0: 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
83c0: 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50 61  INE void btreePa
83d0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
83e0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20  eForOverflow(.  
83f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8400: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8410: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8420: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8430: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8440: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8450: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8460: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8470: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8480: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8490: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ture */.){.  /* 
84a0: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
84b0: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
84c0: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
84d0: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
84e0: 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65  e.  ** to decide
84f0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8500: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8510: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8520: 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66   onto.  ** overf
8530: 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20  low pages.  The 
8540: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d  strategy is to m
8550: 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75  inimize the amou
8560: 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a  nt of unused.  *
8570: 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66  * space on overf
8580: 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20  low pages while 
8590: 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75  keeping the amou
85a0: 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72  nt of local stor
85b0: 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77  age.  ** in betw
85c0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
85d0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a   maxLocal..  **.
85e0: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
85f0: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
8600: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
8610: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
8620: 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20  in any.  ** way 
8630: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
8640: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
8650: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f  ile format..  */
8660: 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b  .  int minLocal;
8670: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
8680: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8690: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
86a0: 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20   int maxLocal;  
86b0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  /* Maximum amoun
86c0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
86d0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
86e0: 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a  nt surplus;   /*
86f0: 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   Overflow payloa
8700: 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  d available for 
8710: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f  local storage */
8720: 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ..  minLocal = p
8730: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
8740: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
8750: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
8760: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
8770: 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  al + (pInfo->nPa
8780: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
8790: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
87a0: 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20  sableSize-4);.  
87b0: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
87c0: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
87d0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
87e0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
87f0: 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73 20  ;.  if( surplus 
8800: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
8810: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8820: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8830: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8840: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
8850: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  16)minLocal;.  }
8860: 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66  .  pInfo->iOverf
8870: 6c 6f 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e  low = (u16)(&pIn
8880: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e  fo->pPayload[pIn
8890: 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43  fo->nLocal] - pC
88a0: 65 6c 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ell);.  pInfo->n
88b0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
88c0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a  verflow + 4;.}..
88d0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
88e0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
88f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
8900: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   of the MemPage.
8910: 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20  xParseCell().** 
8920: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  method..**.** Pa
8930: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
8940: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
8950: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
8960: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  o structure..**.
8970: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8980: 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e  lPtr()        =>
8990: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c     table btree l
89a0: 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  eaf nodes.** btr
89b0: 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79  eeParseCellNoPay
89c0: 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62  load()  =>   tab
89d0: 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61  le btree interna
89e0: 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  l nodes.** btree
89f0: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8a00: 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78  x()   =>   index
8a10: 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a   btree nodes.**.
8a20: 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f  ** There is also
8a30: 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63 74   a wrapper funct
8a40: 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43 65  ion btreeParseCe
8a50: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
8a60: 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61  for.** all MemPa
8a70: 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68 61  ge types and tha
8a80: 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65  t references the
8a90: 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72   cell by index r
8aa0: 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79  ather than.** by
8ab0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
8ac0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
8ad0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
8ae0: 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad(.  MemPage *
8af0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8b00: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8b10: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8b20: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
8b30: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8b40: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
8b50: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
8b60: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8b70: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8b80: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8b90: 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
8ba0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8bb0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8bc0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8bd0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b  Page->leaf==0 );
8be0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8bf0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20  ->noPayload );. 
8c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8c10: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
8c20: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8c30: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
8c40: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
8c50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
8c60: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
8c70: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
8c80: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
8c90: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
8ca0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8cb0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8cc0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f  = 0;.  pInfo->iO
8cd0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70  verflow = 0;.  p
8ce0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
8cf0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
8d00: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
8d10: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
8d20: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8d30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8d40: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8d50: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8d60: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8d70: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8d80: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8d90: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8da0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8db0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8dc0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
8dd0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
8de0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
8df0: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
8e00: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
8e10: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
8e20: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
8e30: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
8e40: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
8e50: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
8e60: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
8e70: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
8e80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8ea0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ec0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
8ed0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
8ee0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
8ef0: 74 4b 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67  tKeyLeaf || pPag
8f00: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a  e->noPayload );.
8f10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8f20: 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b  >noPayload==0 );
8f30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8f40: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
8f50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8f60: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
8f70: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
8f80: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
8f90: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
8fa0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
8fb0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
8fc0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8fd0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
8fe0: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
8ff0: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9000: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9010: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9020: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9030: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9040: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9050: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9060: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9070: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9080: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9090: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
90a0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
90b0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
90c0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
90d0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
90e0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
90f0: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9100: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9110: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9120: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9130: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9140: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
9150: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
9160: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
9170: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
9180: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
9190: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
91a0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
91b0: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
91c0: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
91d0: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
91e0: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
91f0: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9200: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9210: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9220: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9230: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9240: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
9250: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
9260: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
9270: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
9280: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
9290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
92b0: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
92c0: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
92d0: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
92e0: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
92f0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9300: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9310: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9320: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9330: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9340: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9350: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
9360: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
9370: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
9380: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
9390: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
93a0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
93b0: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
93c0: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
93d0: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
93e0: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
93f0: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9400: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9410: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9420: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9430: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9440: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
9450: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
9460: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
9470: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
9480: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
9490: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
94a0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
94b0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
94c0: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
94d0: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
94e0: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
94f0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9500: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
9510: 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ex(.  MemPage *p
9520: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9530: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9540: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9550: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9560: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9570: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9580: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9590: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
95a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
95b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
95c0: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
95d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
95e0: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
95f0: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
9600: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
9610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9620: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
9630: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
9640: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9650: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9660: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9670: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9680: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
9690: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
96a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
96b0: 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a  ntKeyLeaf==0 );.
96c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
96d0: 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b  >noPayload==0 );
96e0: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
96f0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9700: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9710: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9720: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9730: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9740: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9750: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9760: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9770: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9780: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9790: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
97a0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
97b0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
97c0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
97d0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
97e0: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
97f0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9800: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9810: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9820: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9830: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9840: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9850: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9860: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9870: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9880: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9890: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
98a0: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
98b0: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
98c0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
98d0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
98e0: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
98f0: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9900: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9910: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9920: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9930: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9940: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9950: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9960: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9970: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9980: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9990: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
99a0: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
99b0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
99c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
99d0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
99e0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
99f0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
9a00: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
9a10: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9a20: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
9a30: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9a40: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9a50: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9a60: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9a80: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
9a90: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
9aa0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9ab0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9ac0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9ad0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9ae0: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
9af0: 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  l(pPage, findCel
9b00: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c  l(pPage, iCell),
9b10: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
9b20: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9b30: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
9b40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
9b50: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c  the MemPage.xCel
9b60: 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e  lSize.** method.
9b70: 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  .**.** Compute t
9b80: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
9b90: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
9ba0: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
9bb0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
9bc0: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
9bd0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
9be0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
9bf0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
9c00: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
9c10: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
9c20: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
9c30: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
9c40: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
9c50: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
9c60: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c  nter..**.** cell
9c70: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
9c80: 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65  ()    =>   table
9c90: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
9ca0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  ** cellSizePtr()
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
9cc0: 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65    all index node
9cd0: 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e  s & table leaf n
9ce0: 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75  odes.*/.static u
9cf0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
9d00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
9d10: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
9d20: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
9d30: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9d40: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
9d50: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
9d60: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
9d70: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
9da0: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
9db0: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9de0: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
9df0: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
9e00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9e10: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
9e20: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
9e30: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
9e40: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
9e50: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
9e60: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
9e70: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
9e80: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
9e90: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
9ea0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
9eb0: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
9ec0: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
9ed0: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
9ee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
9ef0: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
9f00: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
9f10: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
9f20: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
9f30: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
9f40: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
9f50: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
9f60: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  o);.#endif..  as
9f70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50  sert( pPage->noP
9f80: 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e  ayload==0 );.  n
9f90: 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20  Size = *pIter;. 
9fa0: 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30   if( nSize>=0x80
9fb0: 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26   ){.    pEnd = &
9fc0: 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53  pIter[8];.    nS
9fd0: 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  ize &= 0x7f;.   
9fe0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65   do{.      nSize
9ff0: 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20   = (nSize<<7) | 
a000: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
a010: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a  );.    }while( *
a020: 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  (pIter)>=0x80 &&
a030: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
a040: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20   }.  pIter++;.  
a050: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
a060: 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65  y ){.    /* pIte
a070: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
a080: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
a090: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
a0a0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
a0b0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
a0c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
a0d0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
a0e0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
a0f0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
a100: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
a110: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
a120: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
a130: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
a140: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
a150: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
a160: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73  End );.  }.  tes
a170: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a180: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a190: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
a1a0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
a1b0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a1c0: 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Size<=pPage->max
a1d0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69  Local ){.    nSi
a1e0: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
a1f0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  r - pCell);.    
a200: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53  if( nSize<4 ) nS
a210: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65  ize = 4;.  }else
a220: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  {.    int minLoc
a230: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
a240: 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20  ocal;.    nSize 
a250: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53  = minLocal + (nS
a260: 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20  ize - minLocal) 
a270: 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
a280: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
a290: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
a2a0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a2b0: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
a2c0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a2d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a2e0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
a2f0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a300: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
a310: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
a320: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20  .    nSize += 4 
a330: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
a340: 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73  pCell);.  }.  as
a350: 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62  sert( nSize==deb
a360: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20  uginfo.nSize || 
a370: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a380: 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a  return (u16)nSiz
a390: 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20  e;.}.static u16 
a3a0: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
a3b0: 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50  load(MemPage *pP
a3c0: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a3d0: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a3e0: 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72  Cell + 4; /* For
a3f0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79   looping over by
a400: 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a  tes of pCell */.
a410: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
a420: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a430: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a440: 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
a450: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
a460: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
a470: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
a480: 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  on should always
a490: 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a   be the same as.
a4a0: 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e    ** the (CellIn
a4b0: 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20  fo.nSize) value 
a4c0: 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61  found by doing a
a4d0: 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74   full parse of t
a4e0: 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66  he.  ** cell. If
a4f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73   SQLITE_DEBUG is
a500: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
a510: 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74  ert() at the bot
a520: 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73  tom of.  ** this
a530: 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69   function verifi
a540: 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76  es that this inv
a550: 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69  ariant is not vi
a560: 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c  olated. */.  Cel
a570: 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b  lInfo debuginfo;
a580: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
a590: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
a5a0: 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a  l, &debuginfo);.
a5b0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
a5c0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
a5d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
a5e0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
a5f0: 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70  trSize==4 );.  p
a600: 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b  End = pIter + 9;
a610: 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65  .  while( (*pIte
a620: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
a630: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73  er<pEnd );.  ass
a640: 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e  ert( debuginfo.n
a650: 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65  Size==(u16)(pIte
a660: 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  r - pCell) || CO
a670: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a680: 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65 72  turn (u16)(pIter
a690: 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23   - pCell);.}...#
a6a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a6b0: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
a6c0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
a6d0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
a6e0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
a6f0: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
a700: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
a710: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
a720: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a730: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
a740: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
a750: 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  e(pPage, findCel
a760: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
a770: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
a780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a790: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
a7a0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
a7b0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
a7c0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
a7d0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
a7e0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
a7f0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
a800: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
a810: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
a820: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
a830: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a840: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
a850: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a860: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
a870: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
a880: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
a890: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
a8a0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
a8b0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  );.  pPage->xPar
a8c0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a8d0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
a8e0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
a8f0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
a900: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
a910: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
a920: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
a930: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
a940: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
a950: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
a960: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
a970: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
a980: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
a990: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
a9a0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
a9b0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
a9c0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
a9d0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
a9e0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
a9f0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
aa00: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
aa10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
aa20: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
aa30: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
aa40: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
aa50: 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20  ent area..**.** 
aa60: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
aa70: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
aa80: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
aa90: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
aaa0: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
aab0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
aac0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
aad0: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
aae0: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
aaf0: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
ab00: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
ab10: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
ab20: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
ab30: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
ab40: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
ab50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
ab60: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
ab70: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
ab80: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ab90: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
abc0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
abf0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
ac00: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ac20: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
ac30: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
ac40: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
ac50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ac60: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
ac70: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac90: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
aca0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
acb0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
acc0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
acd0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ace0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
acf0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
ad00: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
ad10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ad20: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ad30: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
ad40: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
ad50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ad60: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
ad70: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
ad80: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
ad90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
ada0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
adb0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
adc0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
add0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
ade0: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
adf0: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
ae00: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
ae10: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
ae20: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ae30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
ae40: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
ae50: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
ae60: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ae70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
ae80: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
ae90: 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72  dex */...  asser
aea0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
aeb0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
aec0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
aed0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
aee0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
aef0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
af00: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
af10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
af20: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
af30: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
af40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
af50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
af60: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
af70: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
af80: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
af90: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
afa0: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
afb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
afc0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
afd0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
afe0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
aff0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
b000: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
b010: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
b020: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
b030: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
b040: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
b050: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
b060: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
b070: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
b080: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
b090: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
b0a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
b0b0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
b0c0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
b0d0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
b0e0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
b0f0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
b100: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
b110: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
b120: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
b130: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
b140: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
b150: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
b160: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
b170: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
b180: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
b190: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
b1a0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
b1b0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
b1c0: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
b1d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b1e0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
b1f0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
b200: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
b210: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b220: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
b230: 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46  sert( pc>=iCellF
b240: 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c  irst && pc<=iCel
b250: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a  lLast );.    siz
b260: 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  e = pPage->xCell
b270: 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63  Size(pPage, &src
b280: 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20  [pc]);.    cbrk 
b290: 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28  -= size;.    if(
b2a0: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
b2b0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
b2c0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
b2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b2e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
b2f0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  }.    assert( cb
b300: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
b310: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
b340: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
b350: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b360: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
b370: 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62  ize );.    put2b
b380: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
b390: 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d  ;.    if( temp==
b3a0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  0 ){.      int x
b3b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b  ;.      if( cbrk
b3c0: 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==pc ) continue;
b3d0: 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71  .      temp = sq
b3e0: 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
b3f0: 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ace(pPage->pBt->
b400: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78  pPager);.      x
b410: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b420: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20  a[hdr+5]);.     
b430: 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d   memcpy(&temp[x]
b440: 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72  , &data[x], (cbr
b450: 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20  k+size) - x);.  
b460: 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a      src = temp;.
b470: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
b480: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73  (&data[cbrk], &s
b490: 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  rc[pc], size);. 
b4a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72   }.  assert( cbr
b4b0: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
b4c0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
b4d0: 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b  a[hdr+5], cbrk);
b4e0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
b4f0: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
b500: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b510: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  r+7] = 0;.  mems
b520: 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69  et(&data[iCellFi
b530: 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43  rst], 0, cbrk-iC
b540: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73  ellFirst);.  ass
b550: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b560: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
b570: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b580: 20 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c    if( cbrk-iCell
b590: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
b5a0: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
b5b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b5c0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
b5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b5e0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74  ../*.** Search t
b5f0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20  he free-list on 
b600: 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61  page pPg for spa
b610: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65  ce to store a ce
b620: 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69  ll nByte bytes i
b630: 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e  n.** size. If on
b640: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  e can be found, 
b650: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
b660: 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e   to the space an
b670: 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66  d remove it.** f
b680: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
b690: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  t..**.** If no s
b6a0: 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61  uitable space ca
b6b0: 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68  n be found on th
b6c0: 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74  e free-list, ret
b6d0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
b6e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
b6f0: 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74  y detect corrupt
b700: 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20  ion within pPg. 
b710: 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69   If corruption i
b720: 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68  s.** detected th
b730: 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74  en *pRc is set t
b740: 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  o SQLITE_CORRUPT
b750: 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74   and NULL is ret
b760: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f  urned..**.** Slo
b770: 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c  ts on the free l
b780: 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74  ist that are bet
b790: 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74  ween 1 and 3 byt
b7a0: 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  es larger than n
b7b0: 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  Byte.** will be 
b7c0: 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e  ignored if addin
b7d0: 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63  g the extra spac
b7e0: 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e  e to the fragmen
b7f0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20  tation count.** 
b800: 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d  causes the fragm
b810: 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74  entation count t
b820: 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a  o exceed 60..*/.
b830: 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46  static u8 *pageF
b840: 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20  indSlot(MemPage 
b850: 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c  *pPg, int nByte,
b860: 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f   int *pRc){.  co
b870: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
b880: 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
b890: 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
b8a0: 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
b8b0: 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72   int iAddr = hdr
b8c0: 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d   + 1;.  int pc =
b8d0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
b8e0: 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20  [iAddr]);.  int 
b8f0: 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  x;.  int usableS
b900: 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
b910: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61  usableSize;..  a
b920: 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20  ssert( pc>0 );. 
b930: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a   do{.    int siz
b940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b950: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
b960: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a  e slot */.    /*
b970: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
b980: 30 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65  06866-39125 Free
b990: 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79  blocks are alway
b9a0: 73 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f  s connected in o
b9b0: 72 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69  rder of.    ** i
b9c0: 6e 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74  ncreasing offset
b9d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e  . */.    if( pc>
b9e0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20  usableSize-4 || 
b9f0: 70 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20  pc<iAddr+4 ){.  
ba00: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
ba10: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
ba20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
ba30: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
ba40: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31  DENCE-OF: R-2271
ba50: 30 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72  0-53328 The thir
ba60: 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74  d and fourth byt
ba70: 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a  es of each.    *
ba80: 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d  * freeblock form
ba90: 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e   a big-endian in
baa0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
bab0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
bac0: 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20  reeblock.    ** 
bad0: 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64  in bytes, includ
bae0: 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68  ing the 4-byte h
baf0: 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69  eader. */.    si
bb00: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ze = get2byte(&a
bb10: 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  Data[pc+2]);.   
bb20: 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d   if( (x = size -
bb30: 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20   nByte)>=0 ){.  
bb40: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
bb50: 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  =4 );.      test
bb60: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
bb70: 20 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67      if( pc < pPg
bb80: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
bb90: 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a  Pg->nCell || siz
bba0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
bbb0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  e ){.        *pR
bbc0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
bbd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
bbe0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
bbf0: 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29   }else if( x<4 )
bc00: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
bc10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39  DENCE-OF: R-1149
bc20: 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c  8-58022 In a wel
bc30: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
bc40: 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a  page, the total.
bc50: 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
bc60: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72  r of bytes in fr
bc70: 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20  agments may not 
bc80: 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20  exceed 60. */.  
bc90: 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b        if( aData[
bca0: 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75  hdr+7]>57 ) retu
bcb0: 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f  rn 0;..        /
bcc0: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
bcd0: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
bce0: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
bcf0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
bd00: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
bd10: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
bd20: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
bd30: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
bd40: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
bd50: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
bd60: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
bd70: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
bd80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
bd90: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
bda0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
bdb0: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
bdc0: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
bdd0: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
bde0: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
bdf0: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
be00: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
be10: 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
be20: 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  [pc+2], x);.    
be30: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
be40: 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b   &aData[pc + x];
be50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72  .    }.    iAddr
be60: 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20   = pc;.    pc = 
be70: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
be80: 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc]);.  }while( 
be90: 70 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  pc );..  return 
bea0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  0;.}../*.** Allo
beb0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
bec0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
bed0: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
bee0: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
bef0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
bf00: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
bf10: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
bf20: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
bf30: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
bf40: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
bf50: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
bf60: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
bf70: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
bf80: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
bf90: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
bfa0: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
bfb0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
bfc0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
bfd0: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
bfe0: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
bff0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
c000: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
c010: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
c020: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
c030: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
c040: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
c050: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
c060: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
c070: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
c080: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
c090: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
c0a0: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
c0b0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
c0c0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
c0d0: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
c0e0: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
c0f0: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
c100: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
c110: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
c120: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
c130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
c140: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
c150: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
c160: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
c170: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
c180: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c190: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
c1a0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c1b0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
c1c0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
c1d0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
c1e0: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
c1f0: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
c200: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74  aData */.  int t
c210: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
c240: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
c250: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ea */.  int rc =
c260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c280: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
c290: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  ode */.  int gap
c2a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
c2b0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
c2c0: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
c2d0: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
c2e0: 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73  tent */.  .  ass
c2f0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c300: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
c310: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
c320: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c330: 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
c340: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c350: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
c360: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
c370: 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b  ert( nByte>=0 );
c380: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
c390: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
c3a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c3b0: 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a  nFree>=nByte );.
c3c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c3d0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
c3e0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c3f0: 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e   < (int)(pPage->
c400: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
c410: 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  8) );..  assert(
c420: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c430: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
c440: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
c450: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
c460: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
c470: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
c480: 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35  assert( gap<=655
c490: 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  36 );.  /* EVIDE
c4a0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d  NCE-OF: R-29356-
c4b0: 30 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74  02391 If the dat
c4c0: 61 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35  abase uses a 655
c4d0: 33 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a  36-byte page siz
c4e0: 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  e.  ** and the r
c4f0: 65 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73  eserved space is
c500: 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c   zero (the usual
c510: 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72   value for reser
c520: 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20  ved space).  ** 
c530: 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f  then the cell co
c540: 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20  ntent offset of 
c550: 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61  an empty page wa
c560: 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e  nts to be 65536.
c570: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  .  ** However, t
c580: 68 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74  hat integer is t
c590: 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73  oo large to be s
c5a0: 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74  tored in a 2-byt
c5b0: 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20  e unsigned.  ** 
c5c0: 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61  integer, so a va
c5d0: 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64  lue of 0 is used
c5e0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a   in its place. *
c5f0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
c600: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c610: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c  ;.  assert( top<
c620: 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74  =(int)pPage->pBt
c630: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20  ->usableSize ); 
c640: 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65  /* Prevent by ge
c650: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a  tAndInitPage() *
c660: 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20  /.  if( gap>top 
c670: 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d  ){.    if( top==
c680: 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d  0 && pPage->pBt-
c690: 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35  >usableSize==655
c6a0: 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20  36 ){.      top 
c6b0: 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c  = 65536;.    }el
c6c0: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
c6d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6e0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
c6f0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
c700: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
c710: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
c720: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
c730: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
c740: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
c750: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
c760: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
c770: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
c780: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
c790: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
c7a0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
c7b0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
c7c0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
c7d0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
c7e0: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
c7f0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
c800: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
c810: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
c820: 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64  ;.  if( (data[hd
c830: 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72  r+2] || data[hdr
c840: 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74  +1]) && gap+2<=t
c850: 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53  op ){.    u8 *pS
c860: 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53  pace = pageFindS
c870: 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65  lot(pPage, nByte
c880: 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
c890: 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pSpace ){.      
c8a0: 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d  assert( pSpace>=
c8b0: 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20  data && (pSpace 
c8c0: 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b  - data)<65536 );
c8d0: 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28  .      *pIdx = (
c8e0: 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61  int)(pSpace - da
c8f0: 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ta);.      retur
c900: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
c910: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b   }else if( rc ){
c920: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
c930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
c940: 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f  * The request co
c950: 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69  uld not be fulfi
c960: 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65  lled using a fre
c970: 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65  elist slot.  Che
c980: 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69  ck.  ** to see i
c990: 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f  f defragmentatio
c9a0: 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  n is necessary..
c9b0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
c9c0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
c9d0: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
c9e0: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
c9f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
ca00: 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52  >nCell>0 || CORR
ca10: 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63  UPT_DB );.    rc
ca20: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
ca30: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
ca40: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ca50: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
ca60: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ca70: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
ca80: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
ca90: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
caa0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
cab0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
cac0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
cad0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
cae0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
caf0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cb00: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
cb10: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
cb20: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
cb30: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
cb40: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
cb50: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
cb60: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
cb70: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
cb80: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
cb90: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
cba0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cbb0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
cbc0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
cbd0: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
cbe0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
cbf0: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
cc00: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
cc10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
cc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
cc30: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
cc40: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
cc50: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
cc60: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
cc70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cc80: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
cc90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
cca0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
ccb0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
ccc0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
ccd0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
cce0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74  k is pPage->aDat
ccf0: 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  a[iStart].** and
cd00: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
cd10: 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20   block is iSize 
cd20: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a  bytes..**.** Adj
cd30: 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73  acent freeblocks
cd40: 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a   are coalesced..
cd50: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
cd60: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
cd70: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
cd80: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
cd90: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a  reeInitPage(),.*
cda0: 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77  * that routine w
cdb0: 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  ill not detect o
cdc0: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63  verlap between c
cdd0: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
cde0: 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73  ks.  Nor.** does
cdf0: 20 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73   it detect cells
ce00: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   or freeblocks t
ce10: 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74  hat encrouch int
ce20: 6f 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62  o the reserved b
ce30: 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ytes.** at the e
ce40: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nd of the page. 
ce50: 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61   So do additiona
ce60: 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65  l corruption che
ce70: 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a  cks inside this.
ce80: 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72  ** routine and r
ce90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
cea0: 52 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62  RUPT if any prob
ceb0: 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a  lems are found..
cec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
ced0: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
cee0: 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61  *pPage, u16 iSta
cef0: 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a  rt, u16 iSize){.
cf00: 20 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20    u16 iPtr;     
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
cf30: 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78  ss of ptr to nex
cf40: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
cf50: 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20   u16 iFreeBlk;  
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
cf80: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  s of the next fr
cf90: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  eeblock */.  u8 
cfa0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65     /* Page heade
cfd0: 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30  r size.  0 or 10
cfe0: 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20  0 */.  u8 nFrag 
cff0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d010: 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61  Reduction in fra
d020: 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  gmentation */.  
d030: 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20  u16 iOrigSize = 
d040: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
d050: 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
d060: 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65  l value of iSize
d070: 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20   */.  u32 iLast 
d080: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
d090: 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c  ableSize-4; /* L
d0a0: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
d0b0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
d0c0: 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d   */.  u32 iEnd =
d0d0: 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b   iStart + iSize;
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d0f0: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
d100: 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72  he iStart buffer
d110: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
d120: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
d130: 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50  e->aData;   /* P
d140: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  age content */..
d150: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
d160: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
d170: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d180: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
d190: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
d1a0: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
d1b0: 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d  T_DB || iStart>=
d1c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d1d0: 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
d1e0: 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  trSize );.  asse
d1f0: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
d200: 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d  | iEnd <= pPage-
d210: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d220: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d230: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d240: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d250: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d260: 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f   iSize>=4 );   /
d270: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
d280: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
d290: 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c  sert( iStart<=iL
d2a0: 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65  ast );..  /* Ove
d2b0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
d2c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
d2d0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
d2e0: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a  ecure_delete.  *
d2f0: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
d300: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  led */.  if( pPa
d310: 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  ge->pBt->btsFlag
d320: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
d330: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
d340: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
d350: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
d360: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  }..  /* The list
d370: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
d380: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
d390: 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
d3a0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
d3b0: 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
d3c0: 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
d3d0: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
d3e0: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
d3f0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
d400: 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
d410: 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
d420: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
d430: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
d440: 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
d450: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
d460: 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
d470: 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
d480: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
d490: 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
d4a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d4b0: 5b 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46  [iPtr]))>0 && iF
d4c0: 72 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b  reeBlk<iStart ){
d4d0: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d4e0: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74  Blk<iPtr+4 ) ret
d4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d510: 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a  Ptr = iFreeBlk;.
d520: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46      }.    if( iF
d530: 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72  reeBlk>iLast ) r
d540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
d550: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
d560: 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e  ssert( iFreeBlk>
d570: 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b  iPtr || iFreeBlk
d580: 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ==0 );.  .    /*
d590: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a   At this point:.
d5a0: 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42      **    iFreeB
d5b0: 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65  lk:   First free
d5c0: 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61  block after iSta
d5d0: 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e  rt, or zero if n
d5e0: 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50  one.    **    iP
d5f0: 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64  tr:       The ad
d600: 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74  dress of a point
d610: 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20  er to iFreeBlk. 
d620: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
d630: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72  ck to see if iFr
d640: 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20  eeBlk should be 
d650: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
d660: 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74  he end of iStart
d670: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d680: 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e   iFreeBlk && iEn
d690: 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b  d+3>=iFreeBlk ){
d6a0: 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69  .      nFrag = i
d6b0: 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a  FreeBlk - iEnd;.
d6c0: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69        if( iEnd>i
d6d0: 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e  FreeBlk ) return
d6e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d6f0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64  BKPT;.      iEnd
d700: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
d710: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d720: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
d730: 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
d740: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
d750: 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ze ) return SQLI
d760: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d770: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
d780: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
d790: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
d7a0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
d7b0: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
d7c0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
d7d0: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
d7e0: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
d7f0: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
d800: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
d810: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
d820: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
d830: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
d840: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
d850: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
d860: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
d870: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
d880: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
d890: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
d8a0: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
d8b0: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
d8c0: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
d8d0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
d8e0: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
d8f0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
d900: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
d910: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d920: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46  BKPT;.        nF
d930: 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20  rag += iStart - 
d940: 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20  iPtrEnd;.       
d950: 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20   iSize = iEnd - 
d960: 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53  iPtr;.        iS
d970: 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20  tart = iPtr;.   
d980: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d990: 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64  f( nFrag>data[hd
d9a0: 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51  r+7] ) return SQ
d9b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d9c0: 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  T;.    data[hdr+
d9d0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
d9e0: 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67  .  if( iStart==g
d9f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
da00: 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20  r+5]) ){.    /* 
da10: 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  The new freebloc
da20: 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69  k is at the begi
da30: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c  nning of the cel
da40: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a  l content area,.
da50: 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65      ** so just e
da60: 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  xtend the cell c
da70: 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68  ontent area rath
da80: 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61  er than create a
da90: 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72  nother.    ** fr
daa0: 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a  eelist entry */.
dab0: 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64      if( iPtr!=hd
dac0: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
dad0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
dae0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
daf0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72  data[hdr+1], iFr
db00: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
db10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
db20: 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  ], iEnd);.  }els
db30: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  e{.    /* Insert
db40: 20 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   the new freeblo
db50: 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65  ck into the free
db60: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32  list */.    put2
db70: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d  byte(&data[iPtr]
db80: 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70  , iStart);.    p
db90: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
dba0: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
dbb0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
dbc0: 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20  data[iStart+2], 
dbd0: 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50  iSize);.  }.  pP
dbe0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f  age->nFree += iO
dbf0: 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  rigSize;.  retur
dc00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
dc10: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65  /*.** Decode the
dc20: 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65   flags byte (the
dc30: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
dc40: 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61  he header) for a
dc50: 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69   page.** and ini
dc60: 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f  tialize fields o
dc70: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74  f the MemPage st
dc80: 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e  ructure accordin
dc90: 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  gly..**.** Only 
dca0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
dcb0: 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73  mbinations are s
dcc0: 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68  upported.  Anyth
dcd0: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
dce0: 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72   indicates a cor
dcf0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
dd00: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
dd10: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a     PTF_ZERODATA.
dd20: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
dd30: 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45  ERODATA | PTF_LE
dd40: 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  AF.**         PT
dd50: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
dd60: 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20  _INTKEY.**      
dd70: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
dd80: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50  | PTF_INTKEY | P
dd90: 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69  TF_LEAF.*/.stati
dda0: 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67  c int decodeFlag
ddb0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
ddc0: 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b  , int flagByte){
ddd0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
dde0: 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20  ;     /* A copy 
ddf0: 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f  of pPage->pBt */
de00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
de10: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70  e->hdrOffset==(p
de20: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
de30: 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73  100 : 0) );.  as
de40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
de50: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
de60: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
de70: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
de80: 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29  u8)(flagByte>>3)
de90: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
dea0: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
deb0: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
dec0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
ded0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
dee0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
def0: 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  .  pPage->xCellS
df00: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
df10: 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  r;.  pBt = pPage
df20: 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61  ->pBt;.  if( fla
df30: 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46  gByte==(PTF_LEAF
df40: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
df50: 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  Y) ){.    /* EVI
df60: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34  DENCE-OF: R-0364
df70: 30 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65 20  0-13415 A value 
df80: 6f 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70  of 5 means the p
df90: 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69  age is an interi
dfa0: 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  or.    ** table 
dfb0: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
dfc0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
dfd0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
dfe0: 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20  TKEY)==5 );.    
dff0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e000: 52 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41 20  R-20501-61796 A 
e010: 76 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e  value of 13 mean
e020: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
e030: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c  leaf.    ** tabl
e040: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e050: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e060: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e070: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e080: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e090: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e0a0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e0b0: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e0c0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e0d0: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e0e0: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
e0f0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e100: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e110: 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
e120: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
e130: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
e140: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
e150: 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a  >noPayload = 1;.
e160: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
e170: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e180: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
e190: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
e1a0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e1b0: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
e1c0: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
e1d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
e1e0: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
e1f0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e200: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
e210: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
e220: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
e230: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
e240: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
e250: 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c  7225-53936 A val
e260: 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68  ue of 2 means th
e270: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e280: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64  erior.    ** ind
e290: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
e2a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e2b0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
e2c0: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
e2d0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d  NCE-OF: R-16571-
e2e0: 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66  11615 A value of
e2f0: 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61   10 means the pa
e300: 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20  ge is a leaf.   
e310: 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65   ** index b-tree
e320: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e330: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e340: 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  ATA|PTF_LEAF)==1
e350: 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  0 );.    pPage->
e360: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
e370: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
e380: 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
e390: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b  ->noPayload = 0;
e3a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
e3b0: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
e3c0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b  rseCellPtrIndex;
e3d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
e3e0: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
e3f0: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
e400: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
e410: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
e420: 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
e430: 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d  NCE-OF: R-47608-
e440: 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20  56469 Any other 
e450: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d  value for the b-
e460: 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20 69  tree page type i
e470: 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  s.    ** an erro
e480: 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  r. */.    return
e490: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e4a0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
e4b0: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
e4c0: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
e4d0: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
e4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e4f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
e500: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
e510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
e520: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
e530: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
e540: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
e550: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
e560: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
e570: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
e580: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
e590: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
e5a0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
e5b0: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
e5c0: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
e5d0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
e5e0: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
e5f0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
e600: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
e610: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
e620: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
e630: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
e640: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
e650: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
e660: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
e670: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
e680: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
e690: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e6a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
e6b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e6c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e6d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e6e0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e6f0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
e700: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
e710: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
e720: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e730: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
e740: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
e750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
e760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e770: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
e780: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
e790: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e7a0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
e7b0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
e7c0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
e7d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e7e0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
e7f0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
e800: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
e810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
e820: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
e830: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
e840: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
e850: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
e860: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
e870: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
e880: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
e890: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
e8a0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
e8b0: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
e8c0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
e8d0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
e8e0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
e8f0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
e900: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
e910: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
e920: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
e930: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
e940: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
e950: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e960: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
e970: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
e980: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
e990: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e9a0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
e9b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
e9c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
e9d0: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
e9e0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
e9f0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ea00: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
ea10: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
ea20: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
ea30: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
ea40: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
ea50: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
ea60: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
ea70: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ea80: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
ea90: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20  ->aData;.    /* 
eaa0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
eab0: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
eac0: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
ead0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
eae0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ing.    ** the b
eaf0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e  -tree page type.
eb00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f   */.    if( deco
eb10: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
eb20: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
eb30: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eb40: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
eb50: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
eb60: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
eb70: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
eb80: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
eb90: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
eba0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
ebb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
ebc0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
ebd0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
ebe0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
ebf0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
ec00: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
ec10: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61   = hdr + 8 + pPa
ec20: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
ec30: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
ec40: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
ec50: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
ec60: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
ec70: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
ec80: 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  t];.    pPage->a
ec90: 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
eca0: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
ecb0: 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56  Size];.    /* EV
ecc0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30  IDENCE-OF: R-580
ecd0: 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f  15-48175 The two
ece0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
ecf0: 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e   offset 5 design
ed00: 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ates.    ** the 
ed10: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
ed20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
ed30: 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
ed40: 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
ed50: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65  .    ** interpre
ed60: 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f  ted as 65536. */
ed70: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
ed80: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
ed90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a  [hdr+5]);.    /*
eda0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
edb0: 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20  37002-32774 The 
edc0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
edd0: 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76   at offset 3 giv
ede0: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75  es the.    ** nu
edf0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
ee00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
ee10: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
ee20: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ee30: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
ee40: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
ee50: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
ee60: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
ee70: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
ee80: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
ee90: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
eea0: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
eeb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eec0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
eed0: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
eee0: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
eef0: 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20  (pBt) );.    /* 
ef00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
ef10: 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20  4089-57979 If a 
ef20: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
ef30: 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73   cells (which is
ef40: 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73   only.    ** pos
ef50: 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74  sible for a root
ef60: 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65   page of a table
ef70: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
ef80: 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65  o rows) then the
ef90: 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  .    ** offset t
efa0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
efb0: 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
efc0: 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
efd0: 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a   minus the.    *
efe0: 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
eff0: 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
f000: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f010: 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d  >nCell>0 || top=
f020: 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43  =usableSize || C
f030: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20  ORRUPT_DB );..  
f040: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
f050: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
f060: 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f  ight cause us to
f070: 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65   read past the e
f080: 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67  nd.    ** of pag
f090: 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
f0a0: 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a   cell.  .    **.
f0b0: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
f0c0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  wing block of co
f0d0: 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20  de checks early 
f0e0: 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c  to see if a cell
f0f0: 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20   extends.    ** 
f100: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
f110: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
f120: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
f130: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
f140: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  .    ** returned
f150: 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20   if it does..   
f160: 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72   */.    iCellFir
f170: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
f180: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
f190: 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20  ;.    iCellLast 
f1a0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
f1b0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64  ;.    if( pBt->d
f1c0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
f1d0: 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a  E_CellSizeCk ){.
f1e0: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
f1f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f200: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
f210: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
f220: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
f230: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f240: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
f250: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f260: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f270: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
f280: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
f290: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
f2a0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
f2b0: 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
f2c0: 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
f2d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f2e0: 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  pc==iCellFirst )
f2f0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
f300: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
f310: 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t );.        if(
f320: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
f330: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
f340: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
f350: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f360: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
f370: 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70  }.        sz = p
f380: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
f390: 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
f3a0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f3b0: 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
f3c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
f3d0: 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62    if( pc+sz>usab
f3e0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f3f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f400: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f420: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
f430: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
f440: 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a  Last++;.    }  .
f450: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
f460: 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
f470: 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
f480: 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
f490: 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
f4a0: 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
f4b0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
f4c0: 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
f4d0: 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
f4e0: 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63  e first freebloc
f4f0: 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f  k on the page, o
f500: 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  r is zero if the
f510: 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a  re are no.    **
f520: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a   freeblocks. */.
f530: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
f540: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
f550: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
f560: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
f570: 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
f580: 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
f590: 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
f5a0: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
f5b0: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
f5c0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
f5d0: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
f5e0: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
f5f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
f600: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
f610: 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
f620: 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
f630: 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
f640: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
f650: 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
f660: 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74  ne cell before t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
f690: 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68         ** Or, th
f6a0: 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f  e freeblock is o
f6b0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
f6c0: 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
f6d0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f6e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f6f0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
f700: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
f710: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
f720: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
f730: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
f740: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
f750: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
f760: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
f770: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
f780: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f790: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
f7a0: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
f7b0: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
f7c0: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
f7d0: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
f7e0: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
f7f0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
f800: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
f810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f820: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
f830: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
f840: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
f850: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
f860: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
f870: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
f880: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
f890: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
f8a0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
f8b0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
f8c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
f8d0: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
f8e0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
f8f0: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
f900: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
f910: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
f920: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
f930: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
f940: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
f950: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
f960: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
f970: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
f980: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
f990: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
f9a0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
f9b0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
f9c0: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
f9d0: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
f9e0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
f9f0: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
fa00: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
fa10: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
fa20: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
fa30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fa40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fa50: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
fa60: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
fa70: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
fa80: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
fa90: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
faa0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fab0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
fac0: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
fad0: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
fae0: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
faf0: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
fb00: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
fb10: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
fb20: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
fb30: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
fb40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fb50: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
fb60: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
fb70: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
fb80: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
fb90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
fba0: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
fbb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fbc0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
fbd0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fbe0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
fbf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fc00: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
fc10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fc20: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
fc30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
fc40: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
fc50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fc60: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
fc70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fc80: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
fc90: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
fca0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fcb0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
fcc0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
fcd0: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
fce0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
fcf0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
fd00: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
fd10: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
fd20: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
fd30: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
fd40: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
fd50: 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
fd60: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
fd70: 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
fd80: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
fd90: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
fda0: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
fdb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
fdc0: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
fdd0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
fde0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
fdf0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
fe00: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
fe10: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
fe20: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
fe30: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
fe40: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
fe50: 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
fe60: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
fe70: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
fe80: 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
fe90: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
fea0: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
feb0: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
fec0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
fed0: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
fee0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
fef0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
ff00: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
ff10: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
ff20: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
ff30: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
ff40: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
ff50: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
ff60: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
ff70: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
ff80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
ff90: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
ffa0: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
ffb0: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
ffc0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
ffd0: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
ffe0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
fff0: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
10000 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
10010 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
10020 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
10030 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
10040 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
10050 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
10060 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
10070 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
10080 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
10090 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
100a0 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
100b0 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
100c0 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
100d0 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e  >hdrOffset = pgn
100e0 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
100f0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
10100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10110 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
10120 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
10130 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
10140 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
10150 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
10160 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61  f needed.  See a
10170 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75  lso: btreeGetUnu
10180 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  sedPage()..**.**
10190 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45   If the PAGER_GE
101a0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67  T_NOCONTENT flag
101b0 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e   is set, it mean
101c0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
101d0 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74   care.** about t
101e0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
101f0 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74  e page at this t
10200 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20  ime.  So do not 
10210 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a  go to the disk.*
10220 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63  * to fetch the c
10230 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69  ontent.  Just fi
10240 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ll in the conten
10250 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72  t with zeros for
10260 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74   now..** If in t
10270 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c  he future we cal
10280 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  l sqlite3PagerWr
10290 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61  ite() on this pa
102a0 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e  ge, that.** mean
102b0 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65  s we have starte
102c0 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65  d to be concerne
102d0 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20  d about content 
102e0 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20  and the disk.** 
102f0 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
10300 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
10310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
10320 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42  treeGetPage(.  B
10330 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
10340 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
10350 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
10360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10370 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10380 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
10390 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
103a0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
103b0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
103c0 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
103d0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
103e0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
103f0 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
10400 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
10410 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
10420 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
10430 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c  e;..  assert( fl
10440 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
10450 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e  =PAGER_GET_NOCON
10460 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  TENT || flags==P
10470 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10480 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Y );.  assert( s
10490 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
104a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
104b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
104c0 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
104d0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
104e0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
104f0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
10500 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
10510 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
10520 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
10530 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
10540 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
10550 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10560 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
10570 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10580 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
10590 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
105a0 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
105b0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
105c0 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
105d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
105e0 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
105f0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
10600 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
10610 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
10620 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10630 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
10640 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
10650 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
10660 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
10670 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10680 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
10690 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
106a0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
106b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
106c0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
106d0 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
106e0 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
106f0 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
10700 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
10710 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
10720 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
10730 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
10740 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
10750 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
10760 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
10770 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
10780 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
10790 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74  /.static Pgno bt
107a0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53  reePagecount(BtS
107b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72  hared *pBt){.  r
107c0 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65  eturn pBt->nPage
107d0 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42  ;.}.u32 sqlite3B
107e0 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72  treeLastPage(Btr
107f0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
10800 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
10810 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
10820 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42   assert( ((p->pB
10830 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30  t->nPage)&0x8000
10840 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  000)==0 );.  ret
10850 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75  urn btreePagecou
10860 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f  nt(p->pBt);.}../
10870 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
10880 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
10890 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
108a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21  ..**.** If pCur!
108b0 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
108c0 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65   is being fetche
108d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d  d as part of a m
108e0 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20  oveToChild().** 
108f0 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69  call.  Do additi
10900 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63  onal sanity chec
10910 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
10920 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
10930 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74  * And if the fet
10940 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72  ch fails, this r
10950 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72  outine must decr
10960 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67  ement pCur->iPag
10970 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
10980 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20  e is fetched as 
10990 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73  read-write unles
109a0 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55  s pCur is not NU
109b0 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72  LL and is.** a r
109c0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e  ead-only cursor.
109d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
109e0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
109f0 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66  *ppPage is undef
10a00 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
10a10 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
10a20 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
10a30 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
10a40 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
10a50 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
10a60 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10a70 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
10a80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
10a90 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
10aa0 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
10ad0 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
10ae0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
10af0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
10b00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
10b10 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
10b20 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  re */.  BtCursor
10b30 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
10b40 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
10b50 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65  r to receive the
10b60 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a   page, or NULL *
10b70 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c  /.  int bReadOnl
10b80 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
10b90 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
10ba0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65  a read-only page
10bb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10bc0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10bd0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10bf0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10c00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10c10 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43  0 || ppPage==&pC
10c20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
10c30 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
10c40 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10c50 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
10c60 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
10c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
10c80 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
10c90 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
10ca0 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
10cb0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
10cc0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
10cd0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
10ce0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
10cf0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
10d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
10d10 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
10d20 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
10d30 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
10d40 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
10d50 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
10d60 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
10d70 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  ror;.  }.  *ppPa
10d80 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
10d90 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
10da0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
10db0 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
10dc0 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
10dd0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
10de0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
10df0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
10e10 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
10e20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74  ;.      goto get
10e30 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
10e40 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
10e50 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
10e60 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
10e70 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
10e80 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
10e90 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
10ea0 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
10eb0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
10ec0 2f 0a 20 20 69 66 28 20 70 43 75 72 0a 20 20 20  /.  if( pCur.   
10ed0 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e  && ((*ppPage)->n
10ee0 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61  Cell<1 || (*ppPa
10ef0 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  ge)->intKey!=pCu
10f00 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 0a 20 20  r->curIntKey).  
10f10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10f20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10f30 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
10f40 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67  (*ppPage);.    g
10f50 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
10f60 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
10f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10f80 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  ;..getAndInitPag
10f90 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  e_error:.  if( p
10fa0 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67  Cur ) pCur->iPag
10fb0 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e--;.  testcase(
10fc0 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
10fd0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
10fe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
10ff0 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
11000 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
11010 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
11020 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
11030 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
11040 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
11050 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
11060 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
11070 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
11080 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
11090 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
110a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
110b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
110c0 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
110d0 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
110e0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
110f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11100 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11110 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
11120 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
11130 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11140 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
11150 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
11160 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
11170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11180 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11190 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
111a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
111b0 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
111c0 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
111d0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
111e0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
111f0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
11200 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
11210 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ull(pPage);.}../
11220 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
11230 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
11240 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
11250 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
11260 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
11270 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
11280 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11290 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
112a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
112b0 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
112c0 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
112d0 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
112e0 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
112f0 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
11300 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
11310 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
11320 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
11330 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
11340 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
11350 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
11360 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
11370 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
11380 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11390 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
113a0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
113b0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
113c0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
113d0 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
113e0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
113f0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11400 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11410 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11420 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
11430 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
11440 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
11450 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
11460 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
11470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11480 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11490 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
114a0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
114b0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
114c0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
114d0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
114e0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
114f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11500 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
11510 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
11520 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
11530 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
11540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11550 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
11560 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
11570 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
11580 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
11590 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
115a0 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
115b0 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
115c0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
115d0 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
115e0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
115f0 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
11600 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
11610 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
11620 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
11630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
11640 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
11650 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
11660 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
11670 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
11680 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
11690 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
116a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
116b0 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
116c0 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
116d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
116e0 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
116f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11700 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
11710 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11720 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
11730 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
11740 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
11750 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
11760 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11770 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11780 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
11790 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
117a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
117b0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
117c0 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
117d0 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
117e0 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
117f0 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
11800 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
11810 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
11820 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
11830 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
11840 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
11850 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
11860 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11870 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
11880 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
11890 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
118a0 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
118b0 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
118c0 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
118d0 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
118e0 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
118f0 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
11900 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
11910 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
11920 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
11930 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
11940 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
11950 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
11960 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
11970 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
11980 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11990 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
119a0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
119b0 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
119c0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
119d0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
119e0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
119f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
11a00 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
11a10 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
11a20 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
11a30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11a40 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
11a50 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
11a60 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
11a70 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
11a80 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
11a90 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
11aa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
11ab0 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
11ac0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11ae0 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
11af0 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
11b00 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
11b10 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
11b20 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
11b30 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
11b40 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
11b50 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
11b60 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
11b70 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
11b80 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
11b90 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
11ba0 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
11bb0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
11bc0 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
11bd0 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
11be0 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
11bf0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
11c00 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
11c10 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
11c20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
11c30 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
11c40 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
11c50 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
11c60 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
11c70 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
11c80 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
11c90 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
11ca0 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
11cb0 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
11cc0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
11cd0 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
11ce0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
11cf0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
11d00 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
11d10 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
11d20 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
11d30 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
11d40 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
11d50 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
11d60 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
11d70 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
11d80 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
11d90 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
11da0 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
11db0 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
11dc0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11dd0 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
11de0 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
11df0 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
11e00 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
11e10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11e20 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
11e30 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
11e40 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
11e50 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
11e60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11e70 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
11e80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
11e90 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
11ea0 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
11eb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
11ed0 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
11ee0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
11ef0 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
11f00 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
11f10 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
11f20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
11f30 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
11f40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
11f50 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
11f60 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
11f70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
11f80 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
11f90 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
11fa0 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
11fb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11fc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
11fd0 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
11fe0 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
11ff0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
12020 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
12030 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
12040 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
12050 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
12060 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
12070 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
12080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
120a0 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
120b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
120c0 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
120f0 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
12100 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
12110 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
12120 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
12130 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
12140 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
12150 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
12160 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
12170 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
12180 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
12190 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
121a0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
121b0 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
121c0 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
121d0 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
121e0 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
121f0 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
12200 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
12210 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
12220 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
12230 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12240 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
12250 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
12260 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
12270 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
12280 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
12290 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
122a0 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
122d0 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
122e0 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12300 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
12310 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
12320 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
12330 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
12340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12350 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
12360 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12370 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
12380 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12390 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
123a0 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
123b0 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
123c0 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
123d0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
123e0 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
123f0 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
12400 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12410 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
12420 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
12430 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12440 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
12450 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
12460 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
12470 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
12480 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
12490 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
124a0 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
124b0 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
124c0 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
124d0 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
124e0 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
124f0 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
12500 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
12510 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
12520 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
12530 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
12540 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
12550 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
12560 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
12570 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
12580 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
12590 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
125a0 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
125b0 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
125c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
125d0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
125e0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
125f0 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
12600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12610 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
12620 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
12630 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
12640 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
12650 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
12660 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
12670 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
12680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12690 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
126a0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
126b0 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
126c0 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
126d0 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
126e0 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
126f0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
12700 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
12710 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
12720 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
12730 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
12740 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
12750 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
12760 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
12790 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65  .      int nFile
127a0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
127b0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
127c0 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  )+1;.      int n
127d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
127e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
127f0 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
12800 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
12810 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58  qlite3Malloc(MAX
12820 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e  (nFullPathname,n
12830 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
12840 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
12850 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
12860 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20  texShared; )..  
12870 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
12880 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
12890 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
128a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
128b0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
128c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
128d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
128e0 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
128f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
12900 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
12910 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
12920 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
12930 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
12940 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
12950 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
12960 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
12990 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
129a0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
129b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
129c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
129d0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
129e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
129f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12a00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12a10 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
12a20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
12a30 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
12a40 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
12a50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12a60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12a70 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
12a80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12a90 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
12aa0 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
12ab0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
12ac0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
12ad0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
12ae0 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
12af0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
12b00 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
12b10 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
12b20 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
12b30 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12b40 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
12b50 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
12b60 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12b70 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
12b80 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
12b90 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
12ba0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
12bb0 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
12bc0 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12be0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
12bf0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
12c00 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
12c10 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
12c20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
12c30 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
12c40 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
12c50 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
12c60 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
12c70 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
12c80 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
12c90 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
12ca0 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
12cb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12cc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
12cd0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
12ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12cf0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
12d00 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
12d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12d20 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
12d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
12d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12d70 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
12d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12da0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
12db0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
12dc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
12dd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
12de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
12df0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12e00 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
12e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12e20 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
12e30 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
12e40 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
12e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
12e60 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
12e70 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
12e80 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
12e90 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
12ea0 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
12eb0 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
12ec0 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
12ed0 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
12ee0 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
12ef0 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
12f00 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
12f10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12f20 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
12f30 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
12f40 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
12f50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12f60 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
12f70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
12f80 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
12f90 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
12fa0 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
12fb0 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
12fc0 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
12fd0 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
12fe0 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
12ff0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
13000 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
13010 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
13020 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
13030 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
13040 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
13050 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
13060 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
13070 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13080 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
13090 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
130a0 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
130b0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
130c0 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
130d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
130e0 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
130f0 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
13100 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
13110 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
13120 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
13130 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
13140 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
13150 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13160 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
13170 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13180 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13190 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
131a0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
131b0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
131e0 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
131f0 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13200 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13220 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
13230 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
13240 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
13250 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13260 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
13270 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13280 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13290 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
132a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
132b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
132c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
132d0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
132e0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
132f0 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13300 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13310 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
13320 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
13330 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
13340 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13350 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
13360 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
13370 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13380 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13390 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
133a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
133b0 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
133c0 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
133d0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
133e0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
133f0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13400 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13410 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13420 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
13430 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
13440 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
13450 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
13460 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
13470 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13480 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13490 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
134a0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
134b0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
134c0 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
134d0 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
134e0 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
134f0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13500 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13510 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
13520 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
13530 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
13540 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
13550 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
13560 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
13570 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13580 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13590 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
135a0 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
135b0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
135c0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
135d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
135e0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
135f0 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13600 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13610 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
13620 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
13630 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
13640 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
13650 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
13660 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
13670 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13680 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13690 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
136a0 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
136b0 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
136c0 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
136d0 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
136e0 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
136f0 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13700 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13710 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
13720 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
13730 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
13740 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
13750 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
13760 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
13770 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13780 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13790 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
137a0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
137b0 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
137c0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
137d0 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
137e0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
137f0 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13800 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13810 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13820 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13830 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13840 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13850 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13860 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13870 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13880 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13890 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
138a0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
138b0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
138c0 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
138d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
138e0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
138f0 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13900 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13910 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13920 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13930 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13950 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13960 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13970 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13980 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13990 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
139a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
139b0 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
139c0 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
139d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
139e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
139f0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13a00 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13a10 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13a20 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13a30 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13a40 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13a50 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13a60 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13a70 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13a80 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13a90 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13aa0 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13ab0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13ac0 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#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 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13b20 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13b30 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13b40 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13b50 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13b60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13b70 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13b80 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13b90 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13ba0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13bb0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13bc0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13bd0 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13be0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13bf0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13c00 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13c10 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13c20 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13c30 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13c40 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13c50 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13c60 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13c70 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13c80 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13c90 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13ca0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13cb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13cc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
13cd0 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
13ce0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
13cf0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13d00 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
13d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13d30 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
13d40 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
13d50 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
13d60 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
13d70 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
13d80 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
13d90 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
13da0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
13db0 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
13dc0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13dd0 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13de0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
13df0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
13e00 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13e10 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
13e20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
13e30 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
13e40 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
13e50 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
13e60 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
13e70 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
13e80 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
13e90 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
13ea0 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
13eb0 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
13ec0 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
13ed0 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
13ee0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
13ef0 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
13f00 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
13f10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13f20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
13f30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
13f40 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
13f50 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
13f60 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
13f70 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
13f80 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
13f90 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
13fa0 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
13fb0 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
13fc0 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
13fd0 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
13fe0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
13ff0 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
14000 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
14010 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
14020 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14040 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
14050 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
14060 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
14070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14080 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
14090 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
140a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
140b0 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
140c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
140d0 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
140e0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
140f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
14100 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
14110 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
14120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
14130 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
14140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14150 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14160 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14170 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
14180 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
14190 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
141a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
141b0 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
141c0 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
141d0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
141e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
141f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
14200 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
14210 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
14220 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
14230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
14240 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
14250 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
14260 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
14270 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
14280 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
14290 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
142a0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
142b0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
142c0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
142d0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
142e0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
142f0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
14300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14310 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
14320 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
14330 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
14340 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
14350 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
14360 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14370 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
14380 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
14390 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
143a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
143b0 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
143c0 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
143d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
143e0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
143f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14400 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
14410 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
14420 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
14430 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
14440 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
14450 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
14460 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
14470 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
14480 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
14490 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
144a0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
144b0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
144c0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
144d0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
144e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
144f0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
14500 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
14510 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
14520 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14530 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
14540 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
14550 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
14560 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
14570 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
14580 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
14590 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
145a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
145b0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
145c0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
145d0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
145e0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
145f0 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
14600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14610 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
14620 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
14630 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
14640 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
14650 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14660 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14670 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
14680 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14690 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
146a0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
146b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
146c0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
146d0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
146e0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
146f0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14700 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
14710 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
14720 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
14730 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
14740 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
14750 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
14760 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
14770 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
14780 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
14790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
147a0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
147b0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
147c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
147d0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
147e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
147f0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
14800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14810 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
14820 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
14830 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
14840 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14850 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
14860 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
14870 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
14880 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
14890 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
148a0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
148b0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
148c0 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
148d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
148e0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
148f0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
14900 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
14910 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14920 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14930 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14940 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
14950 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
14960 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
14970 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14980 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
14990 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
149a0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
149b0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
149c0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
149d0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
149e0 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
149f0 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
14a00 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
14a10 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
14a20 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
14a30 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
14a40 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
14a50 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
14a60 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
14a70 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
14a80 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
14a90 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
14aa0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
14ab0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
14ac0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
14ad0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
14ae0 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
14af0 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
14b00 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
14b10 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
14b20 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
14b30 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
14b40 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
14b50 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
14b60 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
14b70 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
14b80 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
14b90 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
14ba0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
14bb0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
14bc0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
14bd0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
14be0 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
14bf0 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
14c00 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
14c10 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
14c20 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
14c30 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
14c40 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
14c50 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
14c60 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
14c70 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
14c80 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
14c90 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
14ca0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
14cb0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
14cc0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
14cd0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
14ce0 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
14cf0 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
14d00 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
14d10 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
14d20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
14d30 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
14d40 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
14d50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14d60 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
14d70 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14d80 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
14d90 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
14da0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
14db0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
14dc0 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
14dd0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
14de0 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
14df0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
14e00 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
14e10 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
14e20 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
14e30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
14e40 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
14e50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14e60 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
14e70 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
14e80 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
14e90 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
14ea0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
14eb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14ec0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
14ed0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
14ee0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14ef0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
14f00 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
14f10 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
14f20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
14f30 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
14f40 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
14f50 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
14f60 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
14f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
14f80 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
14f90 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14fa0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
14fb0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
14fc0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
14fd0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
14fe0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
14ff0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
15000 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
15010 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
15020 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
15030 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
15040 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15050 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
15060 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
15070 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
15080 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
15090 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
150a0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
150b0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
150c0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
150d0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
150e0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
150f0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
15100 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
15110 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
15120 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
15130 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
15140 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
15150 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
15160 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
15170 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
15180 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
15190 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
151a0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
151b0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
151c0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
151d0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
151e0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
151f0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
15200 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
15210 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
15220 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15240 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
15250 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
15260 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15270 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15280 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
15290 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
152a0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
152b0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
152c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
152d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
152e0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
152f0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
15300 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
15310 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15320 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
15330 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15340 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
15350 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
15360 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
15370 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
15380 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
15390 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
153a0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
153b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
153c0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
153d0 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
153e0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
153f0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15410 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15420 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
15430 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
15440 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
15450 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
15460 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
15470 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
15480 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
15490 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
154a0 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
154b0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
154c0 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
154d0 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
154e0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
154f0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
15500 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
15510 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
15520 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
15530 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
15540 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
15550 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
15560 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
15570 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
15580 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
15590 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
155a0 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
155b0 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
155c0 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
155d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
155e0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
155f0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
15600 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
15610 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
15620 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
15630 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
15640 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
15650 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
15660 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
15670 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
15680 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
15690 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
156a0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
156b0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
156c0 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
156d0 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
156e0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
156f0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
15700 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15710 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15720 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15730 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15740 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15750 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15760 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
15770 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
15780 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
15790 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
157a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
157b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
157c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
157d0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
157e0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
157f0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
15800 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15810 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
15820 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
15830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15840 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
15850 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
15860 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
15870 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15880 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15890 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
158a0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
158b0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
158c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
158d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
158e0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
158f0 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
15900 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15910 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15930 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15940 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15950 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
15960 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
15970 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
15980 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
15990 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
159a0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
159b0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
159c0 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
159d0 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
159e0 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
159f0 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
15a00 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
15a10 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
15a20 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
15a30 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
15a40 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
15a50 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
15a60 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
15a70 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
15a80 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
15a90 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
15aa0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
15ab0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
15ac0 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
15ad0 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
15ae0 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
15af0 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
15b00 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
15b10 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15b20 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
15b30 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
15b40 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
15b50 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b70 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
15b80 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
15b90 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
15ba0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
15bb0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
15bc0 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
15bd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15be0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
15bf0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15c00 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
15c10 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15c20 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15c30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
15c40 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
15c50 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
15c60 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15c70 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15c90 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
15ca0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
15cb0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
15cc0 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
15cd0 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
15ce0 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
15cf0 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
15d00 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
15d10 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
15d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
15d30 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
15d40 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
15d50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15d60 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
15d70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15d80 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15d90 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
15da0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15db0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
15dc0 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
15dd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
15de0 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
15df0 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
15e00 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
15e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15e20 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15e30 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
15e40 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
15e50 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15e60 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
15e70 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
15e80 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
15e90 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
15ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
15eb0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
15ec0 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
15ed0 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
15ee0 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
15ef0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
15f00 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
15f10 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
15f20 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
15f30 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
15f40 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
15f50 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
15f60 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
15f70 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
15f80 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
15f90 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
15fa0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
15fb0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
15fc0 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
15fd0 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
15fe0 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
15ff0 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
16000 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
16010 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
16020 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
16030 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
16040 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
16050 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
16060 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
16070 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
16080 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
16090 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
160a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
160b0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
160c0 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
160d0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
160e0 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
160f0 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
16100 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
16110 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
16120 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
16130 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
16140 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
16150 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
16160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16170 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
16180 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
16190 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
161a0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
161b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
161c0 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
161d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
161e0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
161f0 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
16200 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
16210 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16220 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
16230 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65  ODEC.  if( nRese
16240 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  rve>pBt->optimal
16250 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f  Reserve ) pBt->o
16260 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20  ptimalReserve = 
16270 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65  (u8)nReserve;.#e
16280 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e  ndif.  if( pBt->
16290 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
162a0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
162b0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
162c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
162d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
162e0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
162f0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
16300 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
16310 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
16320 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
16330 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
16340 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
16350 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
16360 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
16370 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
16380 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
16390 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
163a0 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
163b0 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
163c0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
163d0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
163e0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
163f0 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
16400 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
16410 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
16420 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
16430 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
16440 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
16450 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
16460 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
16470 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
16480 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
16490 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
164a0 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
164b0 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
164c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
164d0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
164e0 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
164f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16510 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
16520 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
16530 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
16540 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16550 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
16560 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
16570 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
16580 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16590 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
165a0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
165b0 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
165c0 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
165d0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
165e0 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
165f0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16600 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
16610 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
16620 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
16630 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
16640 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
16650 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
16660 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
16670 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
16680 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
16690 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
166a0 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
166b0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
166c0 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
166d0 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
166e0 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
166f0 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
16700 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
16710 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
16720 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
16730 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
16740 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
16750 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
16760 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
16770 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
16780 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
16790 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
167a0 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
167b0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73  ){.  int n;.  as
167c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
167d0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
167e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d  >mutex) );.  n =
167f0 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
16800 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
16810 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  leSize;.  return
16820 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   n;.}../*.** Ret
16830 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16840 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
16850 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
16860 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
16870 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
16880 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
16890 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
168a0 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
168b0 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
168c0 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
168d0 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ions..**.** If S
168e0 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20  QLITE_HAS_MUTEX 
168f0 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
16900 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  the number retur
16910 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72  ned is the.** gr
16920 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72  eater of the cur
16930 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70  rent reserved sp
16940 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ace and the maxi
16950 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  mum requested.**
16960 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a   reserve space..
16970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16980 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
16990 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
169a0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
169b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
169c0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74  .  n = sqlite3Bt
169d0 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d  reeGetReserveNoM
169e0 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20  utex(p);.#ifdef 
169f0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16a00 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d  .  if( n<p->pBt-
16a10 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
16a20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70  ) n = p->pBt->op
16a30 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65  timalReserve;.#e
16a40 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74  ndif.  sqlite3Bt
16a50 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16a60 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
16a70 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
16a80 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
16a90 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
16aa0 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
16ab0 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
16ac0 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
16ad0 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
16ae0 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
16af0 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
16b00 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
16b10 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
16b20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
16b30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
16b40 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
16b50 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16b60 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
16b70 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
16b80 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
16b90 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
16ba0 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
16bb0 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
16bc0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16bd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
16be0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
16bf0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
16c00 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c  TE flag if newFl
16c10 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  ag is 0 or 1.  I
16c20 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c  f newFlag is -1,
16c30 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f  .** then make no
16c40 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79   changes.  Alway
16c50 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  s return the val
16c60 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45  ue of the BTS_SE
16c70 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73  CURE_DELETE.** s
16c80 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  etting after the
16c90 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
16ca0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
16cb0 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
16cc0 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
16cd0 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
16ce0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
16cf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16d00 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e  nter(p);.  if( n
16d10 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
16d20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
16d30 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45  s &= ~BTS_SECURE
16d40 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28  _DELETE;.    if(
16d50 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42   newFlag ) p->pB
16d60 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16d70 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16d80 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d  ;.  } .  b = (p-
16d90 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
16da0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
16db0 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  TE)!=0;.  sqlite
16dc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16dd0 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f    return b;.}../
16de0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16df0 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
16e00 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
16e10 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
16e20 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
16e30 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
16e40 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
16e50 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
16e60 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
16e70 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
16e80 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
16e90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
16ea0 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
16eb0 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
16ec0 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
16ed0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
16ee0 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
16ef0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16f00 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
16f10 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
16f20 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
16f30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16f40 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
16f50 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16f60 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
16f70 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16f80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16f90 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d  TE_OK;.  u8 av =
16fa0 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b   (u8)autoVacuum;
16fb0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
16fc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
16fd0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
16fe0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
16ff0 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f  XED)!=0 && (av ?
17000 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
17010 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
17020 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
17030 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
17040 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
17050 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
17060 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
17070 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
17080 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17090 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
170a0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
170b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
170c0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
170d0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
170e0 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
170f0 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
17100 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
17110 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
17120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17130 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
17140 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
17150 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
17160 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
17170 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
17180 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
17190 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
171a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
171b0 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
171c0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
171d0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
171e0 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
171f0 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
17200 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
17210 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
17220 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
17230 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
17240 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17260 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
17270 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
17280 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
17290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
172a0 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
172b0 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
172c0 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
172d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
172e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
172f0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
17300 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
17310 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
17320 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
17330 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
17340 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
17350 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
17360 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
17370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
17380 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
17390 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
173a0 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
173b0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
173c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
173d0 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
173e0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
173f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17400 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72  * Result code fr
17410 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
17420 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
17430 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67  age1;     /* Pag
17440 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
17450 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
17460 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
17470 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17480 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
17490 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
174a0 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20  PageFile = 0;   
174b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
174c0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
174d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
174e0 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20   nPageHeader;   
174f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
17500 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
17510 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74  base according t
17520 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65  o hdr */..  asse
17530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17540 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
17550 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
17560 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
17570 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17580 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  PagerSharedLock(
17590 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
175a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
175b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
175c0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
175d0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
175e0 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
175f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
17600 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
17610 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
17620 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
17630 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
17640 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
17650 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
17660 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
17670 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
17680 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
17690 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
176a0 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
176b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
176c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
176d0 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
176e0 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
176f0 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
17700 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
17710 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
17720 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
17730 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
17740 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
17750 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
17760 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
17770 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
17780 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
17790 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20  ->aData;.    rc 
177a0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
177b0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
177c0 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39  -OF: R-43737-399
177d0 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53  99 Every valid S
177e0 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66  QLite database f
177f0 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a  ile begins.    *
17800 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  * with the follo
17810 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69  wing 16 bytes (i
17820 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63  n hex): 53 51 4c
17830 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20   69 74 65 20 66 
17840 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20  6f 72 6d.    ** 
17850 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20  61 74 20 33 00. 
17860 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
17870 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
17880 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
17890 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
178a0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
178b0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
178c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
178d0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
178e0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
178f0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
17900 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
17910 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17920 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
17930 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17940 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
17950 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17960 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
17970 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17980 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
17990 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
179a0 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
179b0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
179c0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
179d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
179e0 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
179f0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
17a00 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
17a10 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
17a20 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
17a30 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
17a40 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
17a50 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
17a60 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
17a70 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
17a80 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
17a90 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
17aa0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
17ab0 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
17ac0 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
17ad0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17ae0 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
17af0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
17b00 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
17b10 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
17b20 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
17b30 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
17b40 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
17b50 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
17b60 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
17b70 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
17b80 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
17b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
17ba0 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
17bb0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17bc0 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
17bd0 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
17be0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
17bf0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
17c00 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
17c10 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
17c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
17c40 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17c50 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
17c60 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
17c70 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
17c80 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
17c90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
17ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17cb0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
17cc0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
17cd0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
17ce0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17cf0 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
17d00 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
17d10 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
17d20 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
17d30 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
17d40 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
17d50 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
17d60 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
17d70 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
17d80 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
17d90 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
17da0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
17db0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
17dc0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
17dd0 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
17de0 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
17df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17e00 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
17e10 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
17e20 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
17e30 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17e40 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
17e50 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17e60 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
17e70 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
17e80 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
17e90 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
17ea0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
17eb0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
17ec0 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
17ed0 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
17ee0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
17ef0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
17f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
17f10 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
17f20 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
17f30 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
17f40 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
17f50 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
17f60 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
17f70 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
17f80 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
17f90 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
17fa0 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
17fb0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
17fc0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
17fd0 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
17fe0 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
17ff0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
18000 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
18010 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
18020 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18030 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18040 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
18050 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
18060 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
18070 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
18080 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
18090 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
180a0 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
180b0 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
180c0 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
180d0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
180e0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
180f0 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
18100 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
18110 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
18120 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
18130 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18140 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
18150 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
18160 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
18170 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
18180 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
18190 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
181a0 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
181b0 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
181c0 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
181d0 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
181e0 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
181f0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
18200 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
18210 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
18220 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
18230 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
18240 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
18250 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
18260 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
18270 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
18280 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
18290 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
182a0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
182b0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
182c0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
182d0 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
182e0 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
182f0 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
18300 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
18310 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
18320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
18330 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
18340 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
18350 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
18360 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
18370 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
18380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
18390 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
183a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
183b0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
183c0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
183d0 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
183e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
183f0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
18400 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18410 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
18420 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
18430 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
18470 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
18480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18490 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62      if( (pBt->db
184a0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
184b0 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d  _RecoveryMode)==
184c0 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65  0 && nPage>nPage
184d0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63  File ){.      rc
184e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
184f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
18500 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18510 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18520 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18530 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f  R-28312-64704 Ho
18540 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c  wever, the usabl
18550 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c  e size is not al
18560 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  lowed to.    ** 
18570 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30  be less than 480
18580 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
18590 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
185a0 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20  ze is 512, then 
185b0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72  the.    ** reser
185c0 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63  ved space size c
185d0 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e  annot exceed 32.
185e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62   */.    if( usab
185f0 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
18600 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18610 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18620 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
18630 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
18640 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
18650 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
18660 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18670 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18680 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
18690 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
186a0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
186b0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
186c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
186d0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
186e0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
186f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
18700 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
18710 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
18720 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
18730 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
18740 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
18750 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
18760 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
18770 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
18780 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
18790 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
187a0 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
187b0 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
187c0 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
187d0 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
187e0 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
187f0 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
18800 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
18810 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
18820 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
18830 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
18840 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
18850 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
18860 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
18870 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
18880 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
18890 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
188a0 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
188b0 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
188c0 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
188d0 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
188e0 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
188f0 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
18900 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
18910 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
18920 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
18930 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
18940 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
18950 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
18960 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18970 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
18980 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
18990 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
189a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
189b0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
189c0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
189d0 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
189e0 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
189f0 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
18a00 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
18a10 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
18a20 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70  5 - 23);.  if( p
18a30 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37  Bt->maxLocal>127
18a40 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78   ){.    pBt->max
18a50 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31  1bytePayload = 1
18a60 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  27;.  }else{.   
18a70 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18a80 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d  yload = (u8)pBt-
18a90 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  >maxLocal;.  }. 
18aa0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
18ab0 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
18ac0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
18ad0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
18ae0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
18af0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
18b00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18b10 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
18b20 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
18b30 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
18b40 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
18b50 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
18b60 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
18b70 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
18b80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
18b90 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
18ba0 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
18bb0 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
18bc0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
18bd0 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
18be0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
18bf0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
18c00 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
18c10 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
18c20 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
18c30 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
18c40 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
18c50 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
18c60 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
18c70 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
18c80 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
18c90 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
18ca0 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
18cb0 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
18cc0 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
18cd0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
18ce0 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
18cf0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
18d00 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
18d10 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
18d20 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
18d30 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
18d40 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
18d50 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
18d60 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
18d70 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
18d80 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
18d90 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
18da0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
18db0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
18dc0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
18dd0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
18de0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
18df0 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
18e00 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
18e10 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
18e20 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
18e30 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
18e40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
18e50 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
18e60 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
18e70 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
18e80 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
18e90 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
18ea0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
18eb0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
18ec0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
18ed0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
18ee0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
18ef0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18f00 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
18f10 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
18f20 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
18f30 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
18f40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
18f50 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
18f60 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
18f70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
18f80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
18f90 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
18fa0 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
18fb0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
18fc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18fd0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
18fe0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
18ff0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
19000 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
19010 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19020 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
19030 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
19040 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
19050 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
19060 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
19070 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
19080 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
19090 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
190a0 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
190b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
190c0 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
190d0 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
190e0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
190f0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
19100 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29  eNotNull(pPage1)
19110 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
19120 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
19130 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
19140 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
19150 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
19160 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
19170 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
19180 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
19190 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
191a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
191b0 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
191c0 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
191d0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
191e0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
191f0 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
19200 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19210 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
19220 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
19230 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
19240 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
19250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19260 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
19270 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
19280 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
19290 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
192a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
192b0 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
192c0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
192d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
192e0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
192f0 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
19300 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
19310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
19320 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
19330 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
19340 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
19350 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
19360 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
19370 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
19380 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
19390 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
193a0 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
193b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
193c0 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
193d0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
193e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
193f0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
19400 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
19410 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
19420 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
19430 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
19440 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
19450 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
19460 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
19470 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
19480 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
19490 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
194a0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
194b0 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
194c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
194d0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
194e0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
194f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19500 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
19510 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
19520 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
19530 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
19540 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
19550 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
19560 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
19570 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
19580 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
19590 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
195a0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
195b0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
195c0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
195d0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
195e0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
195f0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
19600 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19610 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
19620 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
19630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19640 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
19650 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
19660 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
19670 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
19680 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
19690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
196a0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
196b0 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
196c0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
196d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
196e0 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
196f0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
19700 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19710 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
19720 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
19730 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
19740 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
19750 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
19760 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19770 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
19780 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
19790 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
197a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
197b0 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
197c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
197d0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
197e0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
197f0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
19800 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
19810 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
19820 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
19830 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
19840 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
19850 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
19860 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
19870 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
19880 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
19890 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
198a0 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
198b0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
198c0 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
198d0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
198e0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
198f0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
19900 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
19910 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
19920 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
19930 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
19940 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
19950 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
19960 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
19970 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
19980 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
19990 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
199a0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
199b0 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
199c0 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
199d0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
199e0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
199f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19a00 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
19a10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19a20 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
19a30 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19a40 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
19a50 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19a60 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
19a70 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19a80 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
19a90 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19aa0 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
19ab0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
19ac0 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
19ad0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
19ae0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
19af0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
19b00 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
19b10 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
19b20 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
19b30 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
19b40 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
19b50 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
19b60 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
19b70 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
19b80 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
19b90 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
19ba0 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
19bb0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
19bc0 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
19bd0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
19be0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
19bf0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
19c00 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
19c10 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
19c20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
19c30 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
19c40 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
19c50 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
19c60 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
19c70 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
19c80 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
19c90 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
19ca0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
19cb0 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
19cc0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
19cd0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
19ce0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
19cf0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
19d00 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
19d10 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
19d20 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
19d30 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
19d40 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
19d50 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
19d60 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
19d70 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
19d80 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
19d90 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
19da0 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
19db0 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
19dc0 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
19dd0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
19de0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
19df0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
19e00 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
19e10 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
19e20 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
19e30 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
19e40 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
19e50 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
19e60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
19e70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19e80 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
19e90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
19ea0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
19eb0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
19ec0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
19ed0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
19ee0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
19ef0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
19f00 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
19f10 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
19f20 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
19f30 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
19f40 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
19f50 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
19f60 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19f70 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
19f80 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
19f90 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
19fa0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
19fb0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
19fc0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
19fd0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
19fe0 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
19ff0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1a000 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1a010 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1a020 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1a030 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1a040 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1a050 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1a060 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1a070 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1a080 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a090 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1a0a0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a0b0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1a0c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1a0d0 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61  _CACHE.  /* If a
1a0e0 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1a0f0 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1a100 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1a110 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1a120 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1a130 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1a140 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1a150 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1a160 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73  n is.  ** reques
1a170 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1a180 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a  TE_LOCKED..  */.
1a190 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1a1a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a1b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a1c0 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74  ).   || (pBt->bt
1a1d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e  sFlags & BTS_PEN
1a1e0 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20  DING)!=0.  ){.  
1a1f0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
1a200 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
1a210 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1a220 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
1a230 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
1a240 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1a250 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1a260 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1a270 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
1a280 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
1a290 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1a2a0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1a2b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a2c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a2d0 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
1a2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
1a2f0 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1a300 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1a310 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
1a320 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
1a330 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
1a340 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
1a350 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61  if..  /* Any rea
1a360 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77  d-only or read-w
1a370 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1a380 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d   implies a read-
1a390 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61  lock on .  ** pa
1a3a0 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65  ge 1. So if some
1a3b0 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61   other shared-ca
1a3c0 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61  che client alrea
1a3d0 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c  dy has a write-l
1a3e0 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67  ock .  ** on pag
1a3f0 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63  e 1, the transac
1a400 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f  tion cannot be o
1a410 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d  pened. */.  rc =
1a420 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
1a430 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  eTableLock(p, MA
1a440 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
1a450 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c  LOCK);.  if( SQL
1a460 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74  ITE_OK!=rc ) got
1a470 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a  o trans_begun;..
1a480 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
1a490 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c  &= ~BTS_INITIALL
1a4a0 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70  Y_EMPTY;.  if( p
1a4b0 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70  Bt->nPage==0 ) p
1a4c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1a4d0 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1a4e0 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  PTY;.  do {.    
1a4f0 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65  /* Call lockBtre
1a500 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72  e() until either
1a510 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20   pBt->pPage1 is 
1a520 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20  populated or.   
1a530 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20   ** lockBtree() 
1a540 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e  returns somethin
1a550 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  g other than SQL
1a560 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65  ITE_OK. lockBtre
1a570 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72  e().    ** may r
1a580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1a590 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  but leave pBt->p
1a5a0 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69  Page1 set to 0 i
1a5b0 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72  f after.    ** r
1a5c0 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74  eading page 1 it
1a5d0 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20   discovers that 
1a5e0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1a5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
1a600 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f     ** file is no
1a610 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e  t pBt->pageSize.
1a620 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f   In this case lo
1a630 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75  ckBtree() will u
1a640 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74  pdate.    ** pBt
1a650 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68  ->pageSize to th
1a660 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1a670 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1a680 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
1a690 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  e( pBt->pPage1==
1a6a0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  0 && SQLITE_OK==
1a6b0 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28  (rc = lockBtree(
1a6c0 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66  pBt)) );..    if
1a6d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a6e0 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1a6f0 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73     if( (pBt->bts
1a700 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1a710 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20  _ONLY)!=0 ){.   
1a720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a730 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
1a740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a750 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a760 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
1a770 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
1a780 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
1a790 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
1a7a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a7b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1a7c0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1a7d0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
1a7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7f0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
1a800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a810 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1a820 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
1a830 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
1a840 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
1a850 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
1a860 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1a870 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
1a880 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
1a890 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
1a8a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1a8b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1a8c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a8d0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1a8e0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1a8f0 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
1a900 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1a910 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
1a920 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
1a930 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1a940 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
1a950 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
1a960 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
1a970 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
1a980 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
1a990 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
1a9a0 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
1a9b0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
1a9c0 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
1a9d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
1a9e0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
1a9f0 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
1aa00 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
1aa10 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
1aa20 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
1aa30 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1aa40 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1aa50 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
1aa60 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
1aa70 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
1aa80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1aa90 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1aaa0 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1aab0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1aac0 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
1aad0 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
1aae0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
1aaf0 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
1ab00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1ab10 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
1ab20 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
1ab30 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
1ab40 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
1ab50 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
1ab60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
1ab70 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
1ab80 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
1ab90 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
1aba0 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
1abb0 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
1abc0 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
1abd0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
1abe0 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
1abf0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
1ac00 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
1ac10 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
1ac20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1ac30 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
1ac40 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
1ac50 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1ac60 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
1ac70 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
1ac80 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
1ac90 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
1aca0 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
1acb0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1acc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1acd0 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
1ace0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1acf0 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
1ad00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ad10 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1ad20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1ad30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ad40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ad50 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1ad60 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1ad70 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1ad80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ad90 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
1ada0 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
1adb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1adc0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
1add0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
1ade0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
1adf0 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
1ae00 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
1ae10 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
1ae20 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
1ae30 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
1ae40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
1ae50 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
1ae60 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1ae70 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1ae80 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1ae90 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1aea0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1aeb0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1aec0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1aed0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
1aee0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
1aef0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1af00 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1af10 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1af20 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1af30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1af40 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
1af50 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
1af60 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1af70 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
1af80 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
1af90 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
1afa0 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
1afb0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1afc0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
1afd0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
1afe0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
1aff0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1b000 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
1b010 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
1b020 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
1b030 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
1b040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b060 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
1b070 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
1b080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b0a0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
1b0b0 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
1b0c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1b0f0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
1b100 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
1b110 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
1b120 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
1b130 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
1b140 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1b150 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b160 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1b170 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1b180 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
1b190 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1b1a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b1c0 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
1b1d0 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
1b1e0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1b1f0 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1b200 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1b210 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1b220 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1b230 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1b240 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1b250 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1b260 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1b270 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1b280 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1b290 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1b2a0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1b2b0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1b2c0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1b2d0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1b2e0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1b2f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1b300 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1b310 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1b320 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1b330 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1b340 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1b350 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1b360 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1b370 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
1b380 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
1b390 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1b3a0 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
1b3b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b3c0 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
1b3d0 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
1b3e0 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
1b3f0 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
1b400 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
1b410 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
1b420 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
1b430 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
1b440 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
1b450 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
1b460 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
1b470 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
1b480 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
1b490 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1b4a0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1b4b0 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
1b4c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b4d0 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
1b4e0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1b4f0 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
1b500 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1b510 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1b520 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
1b530 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
1b540 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
1b550 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
1b560 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
1b570 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
1b580 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
1b590 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1b5a0 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
1b5b0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1b5c0 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
1b5e0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1b5f0 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
1b600 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
1b610 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
1b620 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
1b630 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
1b640 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
1b650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b660 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1b670 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1b680 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1b690 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
1b6a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
1b6b0 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
1b6c0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1b6d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
1b6e0 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
1b6f0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
1b700 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
1b710 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
1b720 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1b730 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
1b740 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
1b750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1b760 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1b770 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1b780 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1b790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
1b7a0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1b7b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1b7c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1b7d0 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20   nCell;.    int 
1b7e0 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74  rc;..    rc = bt
1b7f0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
1b800 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1b810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b820 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1b830 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
1b840 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1b850 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
1b860 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b870 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
1b880 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1b890 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
1b8a0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
1b8b0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61  nfo;.        pPa
1b8c0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
1b8d0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
1b8e0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
1b8f0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a   info.iOverflow.
1b900 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
1b910 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
1b920 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +3<=pPage->aData
1b930 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
1b940 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46 72  .         && iFr
1b950 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
1b960 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
1b970 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ow]).        ){.
1b980 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1b990 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
1b9a0 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b  Overflow], iTo);
1b9b0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b9c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b9e0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
1b9f0 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
1ba00 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ba10 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
1ba20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1ba30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ba40 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1ba50 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
1ba60 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
1ba70 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1ba80 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
1ba90 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1baa0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bab0 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
1bac0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1bad0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bae0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
1baf0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1bb00 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1bb10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
1bb20 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
1bb30 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
1bb40 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
1bb50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bb60 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1bb70 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1bb80 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1bb90 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1bba0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1bbb0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1bbc0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1bbd0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1bbe0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1bbf0 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1bc00 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1bc10 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1bc20 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1bc30 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1bc40 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1bc50 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1bc60 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1bc70 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1bc80 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1bc90 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1bca0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1bcb0 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1bcc0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1bcd0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1bce0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1bcf0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1bd00 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1bd10 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1bd20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1bd30 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1bd40 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1bd50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1bd60 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1bd70 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1bd80 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1bd90 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1bda0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1bdb0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1bdc0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1bdd0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1bde0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1bdf0 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1be00 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1be10 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1be20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1be30 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1be40 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1be50 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1be60 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1be70 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1be80 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1be90 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1bea0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1beb0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1bec0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1bed0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1bee0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1bef0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1bf00 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1bf10 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1bf20 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1bf30 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1bf40 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1bf50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1bf60 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1bf70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1bf80 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1bf90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1bfa0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1bfb0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
1bfc0 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
1bfd0 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
1bfe0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
1bff0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
1c000 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
1c010 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
1c020 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
1c030 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
1c040 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
1c050 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
1c060 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
1c070 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
1c080 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1c090 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
1c0a0 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
1c0b0 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
1c0c0 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
1c0d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1c0f0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
1c100 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
1c110 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
1c120 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
1c130 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
1c140 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
1c150 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
1c160 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1c170 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
1c180 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1c190 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
1c1a0 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
1c1b0 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
1c1c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
1c1d0 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
1c1e0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
1c1f0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1c200 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
1c210 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
1c220 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1c230 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
1c240 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
1c250 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
1c260 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
1c270 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
1c280 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
1c290 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
1c2a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1c2b0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1c2c0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1c2d0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1c2e0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
1c2f0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
1c300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1c340 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
1c350 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
1c360 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
1c370 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
1c380 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1c390 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d  , nextOvfl, PTRM
1c3a0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46  AP_OVERFLOW2, iF
1c3b0 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  reePage, &rc);. 
1c3c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c3d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c3f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c400 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
1c410 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
1c420 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
1c430 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
1c440 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
1c450 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
1c460 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
1c470 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
1c480 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
1c490 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
1c4a0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
1c4b0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c4c0 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1c4d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
1c4e0 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
1c4f0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
1c500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c510 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c520 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1c530 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c540 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
1c550 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1c560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c570 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c580 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1c590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c5a0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
1c5b0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
1c5c0 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
1c5d0 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1c5e0 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
1c5f0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1c600 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
1c620 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
1c630 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
1c640 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
1c650 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
1c670 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
1c680 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
1c690 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
1c6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
1c6b0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
1c6c0 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
1c6d0 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
1c6e0 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
1c6f0 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
1c700 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
1c710 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
1c720 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
1c730 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
1c740 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
1c750 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
1c760 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
1c770 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
1c780 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1c790 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
1c7a0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
1c7b0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
1c7c0 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
1c7d0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
1c7e0 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
1c7f0 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79  ore specifically
1c800 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c810 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
1c820 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
1c830 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
1c840 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
1c850 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
1c860 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
1c870 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
1c880 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1c890 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
1c8a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
1c8b0 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
1c8c0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
1c8d0 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
1c8e0 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
1c8f0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1c900 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
1c910 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
1c920 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
1c930 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
1c940 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
1c950 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
1c960 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
1c970 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1c980 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
1c990 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
1c9a0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
1c9b0 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
1c9c0 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
1c9d0 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
1c9e0 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  mit .** operatio
1c9f0 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20  n, or false for 
1ca00 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
1ca10 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  acuum..*/.static
1ca20 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
1ca30 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
1ca40 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67  t, Pgno nFin, Pg
1ca50 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20  no iLastPg, int 
1ca60 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f  bCommit){.  Pgno
1ca70 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
1ca80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ca90 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
1caa0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
1cab0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
1cac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cad0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1cae0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1caf0 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e  rt( iLastPg>nFin
1cb00 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
1cb10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1cb20 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
1cb30 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
1cb40 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1cb50 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1cb60 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
1cb70 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
1cb80 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1cb90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1cba0 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
1cbb0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
1cbc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1cbd0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
1cbe0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1cbf0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
1cc00 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
1cc10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1cc20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cc30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1cc40 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1cc50 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1cc60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1cc70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1cc80 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1cc90 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1cca0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
1ccb0 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1ccc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1ccd0 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65   Remove the page
1cce0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20   from the files 
1ccf0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
1cd00 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a  is not required.
1cd10 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43          ** if bC
1cd20 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ommit is non-zer
1cd30 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
1cd40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
1cd50 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
1cd60 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
1cd70 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
1cd80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
1cd90 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
1cda0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
1cdb0 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
1cdc0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
1cdd0 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
1cde0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1cdf0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
1ce00 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1ce10 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1ce20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1ce30 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1ce40 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1ce50 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43  iLastPg, BTALLOC
1ce60 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20  _EXACT);.       
1ce70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ce80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ce90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1cea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1ceb0 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
1cec0 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
1ced0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1cee0 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
1cef0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1cf00 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1cf20 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
1cf30 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
1cf40 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
1cf50 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
1cf60 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d        u8 eMode =
1cf70 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20   BTALLOC_ANY;   
1cf80 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  /* Mode paramete
1cf90 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1cfa0 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20  reePage() */.   
1cfb0 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20     Pgno iNear = 
1cfc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1cfd0 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72  nearby parameter
1cfe0 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
1cff0 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20  eePage() */..   
1d000 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1d010 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
1d020 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b  g, &pLastPg, 0);
1d030 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d050 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d060 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1d070 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a   If bCommit is z
1d080 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
1d090 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
1d0a0 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
1d0b0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
1d0c0 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
1d0d0 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
1d0e0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
1d0f0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
1d100 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
1d110 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
1d120 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61   bCommit is grea
1d130 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
1d140 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
1d150 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
1d160 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
1d170 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
1d180 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
1d190 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1d1a0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
1d1b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1d1c0 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1d1d0 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20          eMode = 
1d1e0 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20  BTALLOC_LE;.    
1d1f0 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e      iNear = nFin
1d200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d210 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
1d220 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1d230 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1d240 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1d250 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1d260 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d  reePg, iNear, eM
1d270 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ode);.        if
1d280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
1d2a0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
1d2c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d2d0 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  }.        releas
1d2e0 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d2f0 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43        }while( bC
1d300 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50 67  ommit && iFreePg
1d310 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61  >nFin );.      a
1d320 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69  ssert( iFreePg<i
1d330 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1d340 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
1d350 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
1d360 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
1d370 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
1d380 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   bCommit);.     
1d390 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1d3a0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
1d3b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d3c0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d3d0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d3e0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43   }.  }..  if( bC
1d3f0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1d400 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74  do {.      iLast
1d410 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Pg--;.    }while
1d420 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
1d430 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1d440 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41  ) || PTRMAP_ISPA
1d450 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1d460 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f   );.    pBt->bDo
1d470 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
1d480 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69    pBt->nPage = i
1d490 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65  LastPg;.  }.  re
1d4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74  }../*.** The dat
1d4c0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1d4d0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1d4e0 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  nt is an auto-va
1d4f0 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a  cuum database.**
1d500 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20   nOrig pages in 
1d510 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
1d520 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65 73  nFree free pages
1d530 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78 70  . Return the exp
1d540 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f  ected .** size o
1d550 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1d560 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e  n pages followin
1d570 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  g an auto-vacuum
1d580 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
1d590 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c  tatic Pgno final
1d5a0 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64 20  DbSize(BtShared 
1d5b0 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67  *pBt, Pgno nOrig
1d5c0 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20  , Pgno nFree){. 
1d5d0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
1d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
1d600 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
1d610 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  map page */.  Pg
1d620 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d640 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61   Number of PtrMa
1d650 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72  p pages to be fr
1d660 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46  eed */.  Pgno nF
1d670 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
1d680 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d690 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e  rn value */..  n
1d6a0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
1d6b0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74  bleSize/5;.  nPt
1d6c0 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f  rmap = (nFree-nO
1d6d0 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e  rig+PTRMAP_PAGEN
1d6e0 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45  O(pBt, nOrig)+nE
1d6f0 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20  ntry)/nEntry;.  
1d700 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
1d710 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
1d720 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
1d730 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1d740 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
1d750 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1d760 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1d770 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54  .  }.  while( PT
1d780 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1d790 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
1d7a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1d7b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1d7c0 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  in--;.  }..  ret
1d7d0 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a  urn nFin;.}../*.
1d7e0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1d7f0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f  action must be o
1d800 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c  pened before cal
1d810 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1d820 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72  on..** It perfor
1d830 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74  ms a single unit
1d840 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73   of work towards
1d850 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1d860 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  vacuum..**.** If
1d870 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1d880 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73   vacuum is finis
1d890 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66  hed after this f
1d8a0 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c  unction has run,
1d8b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  .** SQLITE_DONE 
1d8c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1d8d0 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68  it is not finish
1d8e0 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  ed, but no error
1d8f0 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51   occurred,.** SQ
1d900 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d910 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
1d920 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1d930 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
1d940 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
1d950 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
1d960 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1d970 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d980 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
1d990 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1d9a0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1d9b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1d9c0 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72  WRITE && p->inTr
1d9d0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d9e0 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e   );.  if( !pBt->
1d9f0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1da00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1da10 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  NE;.  }else{.   
1da20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74   Pgno nOrig = bt
1da30 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1da40 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  );.    Pgno nFre
1da50 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1da60 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1da70 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20  [36]);.    Pgno 
1da80 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1da90 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1daa0 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  Free);..    if( 
1dab0 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20  nOrig<nFin ){.  
1dac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dad0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1dae0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65    }else if( nFre
1daf0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
1db00 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1db10 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1db20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1db30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1db40 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1db50 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1db60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e  .        rc = in
1db70 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1db80 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30  , nFin, nOrig, 0
1db90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1dba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dbb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1dbc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1dbd0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1dbe0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1dbf0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1dc00 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1dc10 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1dc20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1dc30 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1dc40 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1dc50 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1dc60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1dc70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dc80 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1dc90 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
1dca0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
1dcb0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
1dcc0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1dcd0 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20  s committed for 
1dce0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1dcf0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
1dd00 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
1dd10 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
1dd20 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
1dd30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1dd40 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
1dd50 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1dd60 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
1dd70 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
1dd80 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
1dd90 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
1dda0 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
1ddb0 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
1ddc0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
1ddd0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
1dde0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
1ddf0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
1de00 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
1de10 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
1de20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1de30 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1de40 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1de50 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
1de60 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
1de70 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1de80 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74  er); )..  assert
1de90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1dea0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1deb0 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
1dec0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1ded0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
1dee0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
1def0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
1df00 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
1df10 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1df20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1df30 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1df40 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
1df50 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
1df60 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
1df70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1df80 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1df90 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
1dfa0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
1dfb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1dfc0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
1dfd0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
1dfe0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
1dff0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
1e000 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
1e010 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
1e020 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1e030 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
1e040 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
1e050 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
1e060 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e070 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
1e080 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
1e090 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
1e0a0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
1e0b0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
1e0c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
1e0d0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
1e0e0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
1e0f0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
1e100 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
1e110 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
1e120 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
1e130 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
1e140 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
1e150 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e160 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1e170 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
1e180 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e190 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1e1a0 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
1e1b0 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1e1c0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
1e1d0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
1e1e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e1f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69  RUPT_BKPT;.    i
1e200 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b  f( nFin<nOrig ){
1e210 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1e220 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1e230 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
1e240 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67   for(iFree=nOrig
1e250 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20  ; iFree>nFin && 
1e260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1e270 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72  Free--){.      r
1e280 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1e290 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46  ep(pBt, nFin, iF
1e2a0 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ree, 1);.    }. 
1e2b0 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
1e2c0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
1e2d0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
1e2e0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1e2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e300 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
1e310 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e320 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1e330 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1e340 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
1e350 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e360 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1e370 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1e380 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e390 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
1e3a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44  );.      pBt->bD
1e3b0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1e3c0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1e3d0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
1e3e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e3f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e400 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1e410 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
1e420 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1e430 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67  nRef>=sqlite3Pag
1e440 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
1e450 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
1e460 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
1e470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e480 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
1e490 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
1e4a0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
1e4b0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
1e4c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e4d0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1e4e0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
1e4f0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1e500 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
1e510 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
1e520 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
1e530 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
1e540 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1e550 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
1e560 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
1e570 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
1e580 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
1e590 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
1e5a0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
1e5b0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
1e5c0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
1e5d0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
1e5e0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
1e5f0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
1e600 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
1e610 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
1e620 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
1e630 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
1e640 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
1e650 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
1e660 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
1e670 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
1e680 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1e690 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1e6a0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
1e6b0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
1e6c0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
1e6d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e6e0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
1e6f0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
1e700 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
1e710 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
1e720 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
1e730 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
1e740 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
1e750 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
1e760 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1e770 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
1e780 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
1e790 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
1e7a0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
1e7b0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
1e7c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1e7d0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
1e7e0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
1e7f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
1e800 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1e810 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
1e820 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
1e830 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
1e840 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1e850 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1e860 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1e870 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
1e880 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
1e890 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
1e8a0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
1e8b0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
1e8c0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
1e8d0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1e8e0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1e8f0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
1e900 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
1e910 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
1e920 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
1e930 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
1e940 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
1e950 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
1e960 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
1e970 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
1e980 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
1e990 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
1e9a0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
1e9b0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
1e9c0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
1e9d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
1e9e0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
1e9f0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
1ea00 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
1ea10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ea20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
1ea30 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
1ea40 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
1ea50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ea60 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
1ea70 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1ea80 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1ea90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1eaa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1eab0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
1eac0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ead0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
1eae0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1eaf0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
1eb00 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1eb10 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
1eb20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eb30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1eb40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1eb50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1eb60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1eb70 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62  }.    if( pBt->b
1eb80 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  DoTruncate ){.  
1eb90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1eba0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
1ebb0 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e  t->pPager, pBt->
1ebc0 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nPage);.    }.#e
1ebd0 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
1ebe0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1ebf0 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
1ec00 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
1ec10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1ec20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
1ec30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ec40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ec50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
1ec60 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
1ec70 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
1ec80 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
1ec90 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
1eca0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
1ecb0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
1ecc0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
1ecd0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
1ece0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
1ecf0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1ed00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1ed10 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
1ed20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1ed30 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1ed40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ed50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ed60 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ed70 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
1ed80 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1ed90 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62  TRANS_NONE && db
1eda0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b  ->nVdbeRead>1 ){
1edb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1edc0 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
1edd0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
1ede0 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
1edf0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1ee00 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
1ee10 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
1ee20 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
1ee30 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
1ee40 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
1ee50 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
1ee60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1ee70 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
1ee80 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
1ee90 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1eea0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1eeb0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1eec0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1eed0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
1eee0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
1eef0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
1ef00 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
1ef10 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1ef20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
1ef30 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
1ef40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1ef50 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
1ef60 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
1ef70 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1ef80 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
1ef90 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1efa0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
1efb0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
1efc0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
1efd0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
1efe0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
1eff0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
1f000 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1f010 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1f020 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1f030 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
1f040 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
1f050 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
1f060 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1f070 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
1f080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f090 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1f0a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1f0b0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
1f0c0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
1f0d0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
1f0e0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
1f0f0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
1f100 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
1f110 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
1f120 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1f130 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1f140 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1f150 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
1f160 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1f170 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
1f180 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
1f190 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
1f1a0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1f1b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f1c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
1f1d0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
1f1e0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
1f1f0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
1f200 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1f210 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
1f220 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1f230 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
1f240 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
1f250 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
1f260 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
1f270 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1f280 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
1f290 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
1f2a0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
1f2b0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1f2c0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
1f2d0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
1f2e0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
1f2f0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
1f300 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
1f310 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
1f320 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
1f330 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
1f340 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
1f350 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
1f360 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
1f370 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1f380 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
1f390 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
1f3a0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
1f3b0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1f3c0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1f3d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1f3e0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1f3f0 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1f400 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1f410 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1f420 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1f430 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1f440 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1f450 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1f460 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1f470 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1f480 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1f490 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1f4a0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1f4b0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1f4c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1f4d0 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1f4e0 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1f4f0 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1f500 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1f510 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1f520 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1f530 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1f540 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f550 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1f560 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1f570 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1f580 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1f590 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1f5a0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1f5b0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1f5c0 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1f5d0 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1f5e0 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1f5f0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1f600 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1f610 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1f620 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1f630 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1f640 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1f650 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1f660 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1f670 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1f680 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1f690 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1f6a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f6b0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1f6c0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1f6d0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1f6e0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1f6f0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1f700 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f710 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1f720 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1f730 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1f740 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1f750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f760 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1f770 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1f780 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f790 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1f7a0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1f7b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1f7c0 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1f7d0 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1f7e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1f7f0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1f800 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1f810 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1f820 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f830 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1f840 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1f850 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1f860 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1f870 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f880 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1f890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1f8a0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1f8b0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1f8c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f8d0 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1f8e0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1f8f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1f900 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1f910 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1f920 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1f930 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f940 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65  }.    p->iDataVe
1f950 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d  rsion--;  /* Com
1f960 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67  pensate for pPag
1f970 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
1f980 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e  ++; */.    pBt->
1f990 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1f9a0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1f9b0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1f9c0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1f9d0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1f9e0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1f9f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1fa00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fa10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1fa20 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1fa30 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1fa40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1fa50 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1fa60 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1fa70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1fa80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fa90 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1faa0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1fab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fac0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1fad0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fae0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1faf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1fb00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1fb10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1fb20 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1fb30 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1fb40 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1fb50 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1fb60 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1fb70 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1fb80 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68 61  any BtShared tha
1fb90 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
1fba0 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74  rences.  Or if t
1fbb0 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61  he writeOnly fla
1fbc0 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74  g is set to 1, t
1fbd0 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70  hen only.** trip
1fbe0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1fbf0 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63 75  nd leave read cu
1fc00 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e  rsors unchanged.
1fc10 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1fc20 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64 61  sor is a candida
1fc30 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65 64  te to be tripped
1fc40 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73  , including curs
1fc50 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f  ors.** that belo
1fc60 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61  ng to other data
1fc70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1fc80 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20   that happen to 
1fc90 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68  be.** sharing th
1fca0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74  e cache with pBt
1fcb0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ree..**.** This 
1fcc0 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c  routine gets cal
1fcd0 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  led when a rollb
1fce0 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74  ack occurs. If t
1fcf0 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20  he writeOnly.** 
1fd00 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
1fd10 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75  en only write-cu
1fd20 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72  rsors need be tr
1fd30 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c  ipped - read-onl
1fd40 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76  y.** cursors sav
1fd50 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74 20  e their current 
1fd60 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61  positions so tha
1fd70 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69  t they may conti
1fd80 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  nue .** followin
1fd90 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  g the rollback. 
1fda0 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  Or, if writeOnly
1fdb0 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63   is false, all c
1fdc0 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74  ursors are .** t
1fdd0 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72  ripped. In gener
1fde0 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73  al, writeOnly is
1fdf0 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74 72   false if the tr
1fe00 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a  ansaction being.
1fe10 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d  ** rolled back m
1fe20 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
1fe30 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20  base schema. In 
1fe40 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65 65  this case b-tree
1fe50 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d   root.** pages m
1fe60 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64  ay be moved or d
1fe70 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20  eleted from the 
1fe80 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74  database altoget
1fe90 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69  her, making.** i
1fea0 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61  t unsafe for rea
1feb0 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e  d cursors to con
1fec0 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tinue..**.** If 
1fed0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
1fee0 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20 61  ag is true and a
1fef0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
1ff00 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a  ntered while .**
1ff10 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72 72   saving the curr
1ff20 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ent position of 
1ff30 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1ff40 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c  or, all cursors,
1ff50 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61   .** including a
1ff60 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20  ll read-cursors 
1ff70 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a  are tripped..**.
1ff80 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1ff90 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
1ffa0 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e  essful, or if an
1ffb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1ffc0 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20  ile.** saving a 
1ffd0 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c  cursor position,
1ffe0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1fff0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
20000 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
20010 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
20020 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
20030 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20040 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
20050 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  *p;.  int rc = S
20060 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
20070 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d  ert( (writeOnly=
20080 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =0 || writeOnly=
20090 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69 74  =1) && BTCF_Writ
200a0 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  eFlag==1 );.  if
200b0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
200c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
200d0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66  r(pBtree);.    f
200e0 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74  or(p=pBtree->pBt
200f0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
20100 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
20110 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
20120 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28  ( writeOnly && (
20130 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
20140 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30  CF_WriteFlag)==0
20150 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20160 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
20170 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53  R_VALID || p->eS
20180 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
20190 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20  PNEXT ){.       
201a0 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73     rc = saveCurs
201b0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
201c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
201d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
201e0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29            (void)
201f0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20200 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65  AllCursors(pBtre
20210 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20  e, rc, 0);.     
20220 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20240 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
20250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20260 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
20270 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  (p);.        p->
20280 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
20290 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70  FAULT;.        p
202a0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
202b0 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Code;.      }.  
202c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
202d0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
202e0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
202f0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
20300 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  );.        p->ap
20310 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
20320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
20330 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20340 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
20350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20360 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
20370 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
20380 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
20390 49 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e  If tripCode is n
203a0 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65  ot SQLITE_OK the
203b0 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  n cursors will b
203c0 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74  e invalidated (t
203d0 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79  ripped)..** Only
203e0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
203f0 72 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72  re tripped if wr
20400 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20  iteOnly is true 
20410 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  but all cursors 
20420 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69  are.** tripped i
20430 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
20440 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d  alse.  Any attem
20450 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74  pt to use.** a t
20460 72 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69  ripped cursor wi
20470 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
20480 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
20490 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
204a0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
204b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
204c0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
204d0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
204e0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
204f0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
20500 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
20510 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
20520 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
20530 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20  t tripCode, int 
20540 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e  writeOnly){.  in
20550 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
20560 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20570 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20580 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72  1;..  assert( wr
20590 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72  iteOnly==1 || wr
205a0 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  iteOnly==0 );.  
205b0 61 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65  assert( tripCode
205c0 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  ==SQLITE_ABORT_R
205d0 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43  OLLBACK || tripC
205e0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
205f0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20600 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
20610 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
20620 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
20630 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41  tripCode = saveA
20640 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
20650 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
20660 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30   ) writeOnly = 0
20670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20680 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20690 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64   }.  if( tripCod
206a0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  e ){.    int rc2
206b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54   = sqlite3BtreeT
206c0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
206d0 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65   tripCode, write
206e0 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72  Only);.    asser
206f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
20700 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d   || (writeOnly==
20710 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45  0 && rc2==SQLITE
20720 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _OK) );.    if( 
20730 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
20740 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20   rc = rc2;.  }. 
20750 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
20760 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
20770 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
20780 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
20790 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
207a0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
207b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
207c0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
207d0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
207e0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
207f0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
20800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20810 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
20820 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
20830 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
20840 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
20850 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
20860 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
20870 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
20880 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
20890 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
208a0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
208b0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
208c0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
208d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
208e0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
208f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20900 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
20910 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
20920 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
20930 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20940 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
20950 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
20960 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
20970 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
20980 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
20990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
209a0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
209b0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
209c0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
209d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
209e0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
209f0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
20a00 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
20a10 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
20a20 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
20a30 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20a40 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
20a50 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
20a60 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
20a70 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
20a80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
20a90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
20aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
20ab0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
20ac0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
20ad0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
20ae0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
20af0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
20b00 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
20b10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
20b20 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
20b30 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
20b40 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
20b50 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
20b60 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
20b70 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
20b80 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
20b90 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
20ba0 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
20bb0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
20bc0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
20bd0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
20be0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
20bf0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
20c00 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
20c10 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
20c20 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
20c30 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
20c40 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
20c50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
20c60 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
20c70 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
20c80 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
20c90 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
20ca0 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
20cb0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
20cc0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
20cd0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
20ce0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
20cf0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
20d00 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
20d10 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
20d20 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
20d30 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
20d40 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
20d50 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
20d60 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
20d70 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
20d80 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
20d90 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
20da0 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
20db0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
20dc0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
20dd0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
20de0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
20df0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
20e00 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
20e10 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
20e20 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
20e30 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
20e40 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
20e50 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
20e60 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
20e70 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
20e80 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
20e90 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
20ea0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
20eb0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
20ec0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
20ed0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
20ee0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
20ef0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
20f00 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
20f10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
20f20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
20f30 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
20f40 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
20f50 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
20f60 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
20f70 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
20f80 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
20f90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
20fa0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
20fb0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
20fc0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
20fd0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
20fe0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
20ff0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
21000 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
21010 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
21020 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
21030 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
21040 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
21050 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
21060 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
21070 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
21080 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
21090 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
210a0 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
210b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
210c0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
210d0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
210e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
210f0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
21100 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
21110 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
21120 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
21130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21140 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
21150 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
21160 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
21170 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
21180 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
21190 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
211a0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
211b0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
211c0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
211d0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
211e0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
211f0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
21200 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
21210 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
21220 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
21230 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
21240 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
21250 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
21260 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
21270 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
21280 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
21290 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
212a0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
212b0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
212c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
212d0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
212e0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
212f0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
21300 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
21310 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
21320 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
21330 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
21340 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
21350 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
21360 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
21370 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
21380 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
21390 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
213a0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
213b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
213c0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
213d0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
213e0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
213f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21400 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21410 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
21420 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
21430 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
21440 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
21450 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
21460 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
21470 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
21480 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
21490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
214a0 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
214b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
214c0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
214d0 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
214e0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
214f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21500 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
21510 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
21520 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
21530 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
21540 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
21550 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
21560 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
21570 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
21580 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
21590 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
215a0 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
215b0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
215c0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
215d0 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
215e0 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
215f0 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
21600 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
21610 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
21620 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
21630 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
21640 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
21650 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
21660 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
21670 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
21680 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
21690 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
216a0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
216b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
216c0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
216d0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
216e0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
216f0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
21700 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
21710 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
21720 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
21730 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
21740 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
21750 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
21760 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
21770 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
21780 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
21790 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
217a0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
217b0 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
217c0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
217d0 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
217e0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
217f0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
21800 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
21810 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
21820 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
21830 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
21840 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
21850 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
21860 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21870 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
21880 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
21890 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
218a0 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
218b0 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
218c0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
218d0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
218e0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
218f0 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
21900 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
21910 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
21920 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
21930 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
21940 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
21950 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21960 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
21970 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
21980 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
21990 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
219a0 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
219b0 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
219c0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
219d0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
219e0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
219f0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
21a00 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
21a10 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
21a20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
21a30 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
21a40 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
21a50 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
21a60 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
21a70 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21a80 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
21a90 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
21aa0 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
21ab0 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
21ac0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
21ad0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
21ae0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
21af0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
21b00 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
21b10 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
21b20 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
21b30 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
21b40 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
21b50 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
21b60 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
21b70 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
21b80 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
21b90 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
21ba0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
21bb0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
21bc0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
21bd0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
21be0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
21bf0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
21c00 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
21c10 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
21c20 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
21c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
21c40 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
21c50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
21c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c70 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
21c80 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
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 52 6f 6f 74           /* Root
21cb0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
21cc0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
21cd0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
21d00 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
21d10 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
21d20 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
21d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
21d40 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
21d50 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
21d60 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
21d70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
21d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
21d90 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
21da0 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
21db0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
21dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21dd0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
21de0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
21df0 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e10 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
21e20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
21e30 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
21e40 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
21e50 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
21e60 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
21e70 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
21e80 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  =1 );..  /* The 
21e90 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
21ea0 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69   statements veri
21eb0 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20  fy that if this 
21ec0 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20  is a sharable . 
21ed0 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62   ** b-tree datab
21ee0 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74  ase, the connect
21ef0 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ion is holding t
21f00 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
21f10 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61  e locks, .  ** a
21f20 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  nd that no other
21f30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
21f40 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20  any open cursor 
21f50 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77  that conflicts w
21f60 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c  ith .  ** this l
21f70 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
21f80 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68  t( hasSharedCach
21f90 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54  eTableLock(p, iT
21fa0 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d  able, pKeyInfo!=
21fb0 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a  0, wrFlag+1) );.
21fc0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
21fd0 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
21fe0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
21ff0 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
22000 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
22010 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
22020 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
22030 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
22040 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
22050 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
22060 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22070 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
22080 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22090 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
220a0 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
220b0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
220c0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
220d0 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  ==0 || (pBt->bts
220e0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
220f0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20  _ONLY)==0 );..  
22100 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
22110 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
22120 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  ace(pBt);.    if
22130 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
22140 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
22150 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
22160 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
22170 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
22180 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
22190 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
221a0 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
221b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
221c0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
221d0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
221e0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
221f0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
22200 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
22210 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
22220 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
22230 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
22240 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
22250 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
22260 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
22270 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
22280 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
22290 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
222a0 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
222b0 42 74 20 3d 20 70 42 74 3b 0a 20 20 61 73 73 65  Bt = pBt;.  asse
222c0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
222d0 20 77 72 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72   wrFlag==BTCF_Wr
222e0 69 74 65 46 6c 61 67 20 29 3b 0a 20 20 70 43 75  iteFlag );.  pCu
222f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
22300 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 63 75  Flag;.  pCur->cu
22310 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
22320 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
22330 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
22340 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
22350 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
22360 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
22370 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
22380 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
22390 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
223a0 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
223b0 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
223c0 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
223d0 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
223e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
223f0 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
22400 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
22410 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
22420 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
22430 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
22440 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
22450 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
22460 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
22470 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
22480 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
22490 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
224a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
224b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
224c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
224d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
224e0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
224f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
22520 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
22530 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
22560 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
22570 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
22580 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
225b0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
225c0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
225d0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
225f0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
22600 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
22610 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22640 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
22650 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
22660 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
22670 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
22680 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22690 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
226a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
226b0 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
226c0 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
226d0 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
226e0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
226f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22700 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
22710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22720 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
22730 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
22740 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
22750 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
22760 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
22770 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
22780 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
22790 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
227a0 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
227b0 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
227c0 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
227d0 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
227e0 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
227f0 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
22800 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
22810 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
22820 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
22830 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
22840 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
22850 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
22860 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
22870 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
22880 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
22890 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
228a0 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
228b0 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
228c0 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
228d0 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
228e0 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
228f0 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
22900 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
22910 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
22920 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
22930 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
22940 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
22950 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
22960 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
22970 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
22980 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
22990 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
229a0 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
229b0 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
229c0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
229d0 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
229e0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
229f0 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
22a00 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
22a10 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
22a20 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
22a30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
22a40 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
22a50 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
22a60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22a70 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
22a80 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
22a90 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
22aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22ab0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
22ac0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22ad0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
22ae0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
22af0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
22b00 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
22b10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22b20 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
22b30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22b40 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
22b50 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
22b60 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
22b70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
22b80 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
22b90 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
22ba0 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
22bb0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
22bc0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
22bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
22be0 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
22bf0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
22c00 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
22c10 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
22c20 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
22c30 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
22c40 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
22c50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22c70 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
22c80 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
22c90 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
22ca0 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
22cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
22cc0 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
22cd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22ce0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
22cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
22d00 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
22d10 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
22d20 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
22d30 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
22d40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
22d50 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
22d60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
22d70 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
22d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22d90 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
22da0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
22db0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
22dc0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
22dd0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
22de0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
22df0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
22e00 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
22e10 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
22e20 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
22e30 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
22e40 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
22e50 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
22e60 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
22e70 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
22e80 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
22e90 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
22ea0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
22eb0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
22ec0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
22ed0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
22ee0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
22ef0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
22f00 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
22f10 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
22f20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
22f30 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
22f40 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
22f50 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
22f60 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
22f70 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
22f80 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
22f90 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
22fa0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
22fb0 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
22fc0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
22fd0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
22fe0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
22ff0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
23000 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
23010 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
23020 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
23030 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
23040 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
23050 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
23060 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
23070 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
23080 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
23090 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
230a0 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
230b0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
230c0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
230d0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
230e0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
230f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
23100 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
23110 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
23120 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
23130 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
23140 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
23150 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
23160 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
23170 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
23180 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
23190 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
231a0 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
231b0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
231c0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
231d0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
231e0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
231f0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
23200 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
23210 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
23220 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
23230 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
23240 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23250 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
23260 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
23270 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
23280 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23290 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
232a0 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
232b0 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
232c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
232d0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
232e0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
232f0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
23300 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
23310 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
23320 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
23330 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
23340 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
23350 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
23360 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
23370 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
23380 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
23390 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
233a0 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
233b0 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
233c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
233d0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
233e0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
233f0 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
23400 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
23410 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
23420 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
23430 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
23440 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
23450 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
23460 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
23470 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
23480 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
23490 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
234a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
234b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
234c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
234d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
234e0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
234f0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
23500 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
23510 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
23520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23530 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
23540 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
23550 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
23560 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
23570 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
23580 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
23590 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
235a0 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
235b0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
235c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
235d0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
235e0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
235f0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
23600 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
23610 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
23620 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
23630 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
23640 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23650 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
23660 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
23670 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
23680 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
23690 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
236a0 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
236b0 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
236c0 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
236d0 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
236e0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
236f0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
23700 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
23710 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
23720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23730 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
23740 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
23750 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
23760 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23770 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23780 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
23790 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
237a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
237b0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
237c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
237d0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
237e0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
237f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23800 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23810 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
23820 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
23830 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
23840 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
23850 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
23860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23870 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
23880 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
23890 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
238a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
238b0 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
238c0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
238d0 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
238e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
238f0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
23900 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
23910 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
23920 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
23930 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
23940 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
23950 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
23960 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
23970 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
23980 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
23990 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
239a0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
239b0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
239c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
239d0 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
239e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
239f0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
23a00 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
23a10 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
23a20 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
23a30 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
23a40 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
23a50 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
23a60 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
23a70 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
23a80 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
23a90 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
23aa0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
23ab0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
23ac0 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
23ad0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
23ae0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
23af0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
23b00 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
23b10 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
23b20 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
23b30 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
23b40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
23b50 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
23b60 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
23b70 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
23b80 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
23b90 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
23ba0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
23bb0 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
23bc0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
23bd0 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
23be0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
23bf0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
23c00 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
23c10 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
23c20 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
23c30 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
23c40 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
23c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23c70 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
23ca0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
23cb0 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
23cc0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
23cd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
23ce0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
23cf0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
23d00 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
23d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23d20 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
23d30 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
23d40 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
23d50 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
23d60 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
23d70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23d80 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
23d90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23da0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
23db0 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
23dc0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
23dd0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
23de0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
23df0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
23e00 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
23e10 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
23e20 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
23e30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
23e40 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
23e50 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
23e60 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
23e70 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
23e80 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
23e90 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
23ea0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
23eb0 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
23ec0 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
23ed0 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
23ee0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
23ef0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
23f00 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
23f10 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
23f20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
23f30 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
23f40 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
23f50 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
23f60 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
23f70 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
23f80 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
23f90 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
23fa0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
23fb0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
23fc0 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
23fd0 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
23fe0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
23ff0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
24000 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
24010 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
24020 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
24030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24040 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
24050 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
24060 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
24070 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
24080 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
24090 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
240a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
240b0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
240c0 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
240d0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
240e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
240f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
24100 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
24110 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
24120 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
24130 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
24140 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
24150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24160 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
24170 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24180 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
24190 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
241a0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
241b0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
241c0 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
241d0 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
241e0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
241f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24200 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
24210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24220 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
24230 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
24240 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
24250 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
24260 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
24270 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
24280 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
24290 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
242a0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
242b0 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
242c0 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
242d0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
242e0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
242f0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
24300 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
24310 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
24320 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
24330 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
24340 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
24350 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
24360 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24370 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
24380 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
24390 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
243a0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
243b0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
243c0 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
243d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
243e0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
243f0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
24400 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
24410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
24420 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
24430 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
24440 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24450 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
24460 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
24470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24480 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
24490 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
244a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
244b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
244c0 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
244d0 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
244e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
244f0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
24500 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
24510 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
24520 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
24530 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
24540 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
24550 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
24560 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
24570 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
24580 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
24590 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
245a0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
245b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
245c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
245d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
245e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
245f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
24600 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
24610 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
24620 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
24630 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
24640 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
24650 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
24660 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
24670 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
24680 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
24690 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
246a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
246b0 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
246c0 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
246d0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
246e0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
246f0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
24700 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
24710 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
24720 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
24730 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
24740 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
24750 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
24760 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
24770 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
24780 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
24790 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
247a0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
247b0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
247c0 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
247d0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
247e0 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
247f0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
24800 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
24810 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
24820 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
24830 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
24840 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
24850 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
24860 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
24870 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
24880 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
24890 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
248a0 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
248b0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
248c0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
248d0 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
248e0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
248f0 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
24900 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
24910 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
24920 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
24930 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
24940 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
24950 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
24960 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
24970 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
24980 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
24990 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
249a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
249b0 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
249c0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
249d0 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
249e0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
249f0 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
24a00 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
24a10 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
24a20 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
24a30 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
24a40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
24a50 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
24a60 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
24a70 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
24a80 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
24a90 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
24aa0 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
24ab0 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
24ac0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
24ad0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
24ae0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
24af0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
24b00 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
24b10 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
24b20 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
24b30 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24b40 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
24b50 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
24b60 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
24b70 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
24b80 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
24b90 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
24ba0 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
24bb0 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
24bc0 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
24bd0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
24be0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
24bf0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
24c00 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
24c10 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
24c20 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
24c30 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
24c40 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
24c50 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
24c60 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
24c70 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
24c80 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
24c90 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
24ca0 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
24cb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
24cc0 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
24cd0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
24ce0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
24cf0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
24d00 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
24d10 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
24d20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
24d30 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
24d40 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
24d50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24d60 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
24d70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24d80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24d90 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
24da0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
24db0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
24dc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
24dd0 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
24de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
24df0 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
24e00 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
24e10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
24e20 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
24e30 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
24e40 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
24e50 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
24e60 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24e90 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
24ea0 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
24eb0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
24ec0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
24ed0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24ee0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24ef0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24f00 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24f10 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
24f20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
24f30 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24f40 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24f50 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
24f60 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
24f70 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
24f80 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
24f90 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
24fa0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
24fb0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
24fc0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
24fd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
24fe0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
24ff0 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
25000 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
25010 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
25020 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
25030 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
25040 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
25050 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
25060 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
25070 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
25080 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
25090 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
250a0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
250b0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
250c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
250d0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
250e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
250f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
25110 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
25120 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
25130 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
25140 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
25150 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
25160 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25170 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
25180 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
25190 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
251a0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
251b0 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
251c0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
251d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
251e0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
251f0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
25200 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
25210 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
25220 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
25230 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
25240 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
25250 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
25260 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
25270 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
25280 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
25290 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
252a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
252b0 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
252c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
252d0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
252e0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
252f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
25300 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
25310 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
25320 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
25330 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
25340 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
25350 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
25360 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
25370 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
25380 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
25390 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
253a0 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
253b0 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
253c0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
253d0 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
253e0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
253f0 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
25400 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
25410 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
25420 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
25430 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
25440 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
25450 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
25460 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
25470 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
25480 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
25490 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
254a0 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
254b0 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
254c0 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
254d0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
254e0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
254f0 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
25500 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
25510 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
25520 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
25530 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
25540 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
25550 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25560 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
25570 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
25580 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
25590 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
255a0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
255b0 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
255c0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
255d0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
255e0 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
255f0 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
25600 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
25610 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
25620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25630 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25650 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
25660 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
25670 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25680 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
25690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
256a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
256b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
256c0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
256d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
256e0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
256f0 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
25700 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25710 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
25720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25730 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
25740 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25750 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
25760 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
25770 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
25780 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
25790 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
257a0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
257b0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
257c0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
257d0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
257e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
257f0 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
25800 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
25810 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
25820 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
25830 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
25840 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
25850 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
25860 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25870 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
25880 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
25890 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
258a0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
258b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
258c0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
258d0 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
258e0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
258f0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
25900 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
25910 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
25920 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25930 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25940 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25950 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
25960 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
25970 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25980 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
25990 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
259a0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
259b0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
259c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
259d0 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
259e0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
259f0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
25a00 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
25a10 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
25a20 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25a30 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
25a40 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
25a50 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
25a60 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
25a70 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
25a80 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
25a90 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
25aa0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
25ab0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
25ac0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
25ad0 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
25ae0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
25af0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
25b00 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
25b10 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
25b20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
25b30 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
25b40 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
25b50 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
25b60 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
25b70 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
25b80 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
25b90 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
25ba0 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
25bb0 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
25bc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
25bd0 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
25be0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
25bf0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
25c00 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
25c10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25c20 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
25c30 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
25c40 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
25c50 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
25c60 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
25c70 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
25c80 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
25c90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25ca0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
25cb0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
25cc0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
25cd0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
25ce0 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
25cf0 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
25d00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25d10 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
25d20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
25d30 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
25d40 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
25d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
25d60 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
25d70 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
25d80 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
25d90 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
25da0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
25db0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25dc0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
25dd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
25de0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
25df0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
25e00 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
25e10 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
25e20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
25e30 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
25e40 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
25e50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
25e60 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
25e70 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
25e80 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
25e90 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
25ea0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25eb0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
25ec0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
25ed0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
25ee0 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
25ef0 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
25f00 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
25f10 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
25f20 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
25f30 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
25f40 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
25f50 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
25f60 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
25f70 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
25f80 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
25f90 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
25fa0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
25fb0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
25fc0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
25fd0 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
25fe0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
25ff0 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
26000 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
26010 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
26020 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
26030 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
26040 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
26050 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
26060 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
26070 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
26080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26090 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
260a0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
260b0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
260c0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
260d0 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
260e0 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
260f0 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
26100 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
26110 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
26120 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
26130 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
26140 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
26180 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
26190 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
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 2f 2a 20 28 32             /* (2
261c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
261d0 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
261e0 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
26210 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
26220 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
26230 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26250 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
26260 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
26270 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
26280 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
26290 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
262a0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
262b0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
262c0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262e0 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
262f0 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
26300 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
26310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26320 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
26330 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
26340 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
26350 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
26360 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
26370 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
26380 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
26390 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
263a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263b0 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
263c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
263d0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
263e0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
263f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26400 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
26410 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
26420 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
26430 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
26440 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
26450 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
26460 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
26470 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
26480 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
26490 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
264a0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
264b0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
264c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
264d0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
264e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
264f0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
26500 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
26510 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
26520 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
26530 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
26540 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
26550 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26560 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
26570 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
26580 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
26590 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
265a0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
265b0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
265c0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
265d0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
265e0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
265f0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
26600 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
26610 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26620 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
26630 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
26640 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
26650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
26660 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
26670 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
26680 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
26690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
266a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
266b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
266c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
266d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
266e0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
266f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
26700 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
26710 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
26720 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
26730 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
26740 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
26750 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
26760 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
26770 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
26780 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
26790 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
267a0 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
267b0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
267c0 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
267d0 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
267e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
267f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
26800 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
26810 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
26820 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
26830 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
26840 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
26850 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
26860 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
26870 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
26880 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26890 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
268a0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
268b0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
268c0 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
268d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
268e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
268f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
26900 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
26910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26920 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
26930 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26940 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
26950 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26960 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26980 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26990 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
269a0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
269b0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
269c0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
269d0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
269e0 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
269f0 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
26a00 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
26a10 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
26a20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
26a30 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
26a40 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
26a50 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
26a60 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
26a70 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26a80 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
26a90 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
26aa0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
26ab0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
26ac0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
26ad0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
26ae0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
26af0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
26b00 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
26b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26b20 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
26b30 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
26b40 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
26b50 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
26b60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26b70 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
26b80 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
26b90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
26ba0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
26bb0 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
26bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
26bd0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26be0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26bf0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
26c00 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
26c10 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
26c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
26c30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26c40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26c50 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
26c60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
26c70 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
26c80 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
26c90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26ca0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26cb0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
26cc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26cd0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
26ce0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
26cf0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
26d00 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
26d10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26d20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
26d30 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
26d40 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
26d50 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
26d60 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
26d70 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
26d80 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
26d90 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
26da0 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
26db0 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
26dc0 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
26dd0 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
26de0 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
26df0 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
26e00 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
26e10 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
26e20 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
26e30 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
26e40 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
26e50 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
26e60 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
26e70 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
26e80 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
26e90 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
26ea0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26eb0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
26ec0 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
26ed0 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
26ee0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
26ef0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
26f00 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
26f10 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
26f20 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
26f30 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
26f40 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
26f50 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
26f60 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
26f70 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
26f80 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
26f90 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
26fa0 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
26fb0 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
26fc0 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
26fd0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
26fe0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
26ff0 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
27000 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
27010 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
27020 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
27030 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
27040 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
27050 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
27060 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
27070 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
27080 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
27090 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
270a0 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
270b0 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
270c0 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
270d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
270e0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
270f0 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
27100 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
27110 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
27120 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
27130 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
27140 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
27150 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
27160 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
27170 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
27180 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
27190 0a 20 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73  .  u32 amt;.  as
271a0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
271b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
271c0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
271d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
271e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
271f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
27200 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
27210 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27220 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
27230 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
27240 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27250 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27270 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27280 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27290 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
272a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
272b0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
272c0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
272d0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
272e0 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
272f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27300 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
27310 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
27320 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27330 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
27340 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27350 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
27360 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
27370 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
27380 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27390 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
273a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
273b0 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
273c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
273d0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
273e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
273f0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
27400 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
27410 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
27420 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
27430 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
27440 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
27450 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
27460 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
27470 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
27480 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
27490 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
274a0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
274b0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
274c0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
274d0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
274e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
274f0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
27500 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
27510 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
27520 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
27530 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
27540 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
27550 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
27560 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
27570 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
27580 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
27590 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
275a0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
275b0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
275c0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
275d0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
275e0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
275f0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
27600 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
27610 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
27620 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
27630 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
27640 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
27650 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
27660 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
27670 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
27680 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
27690 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
276a0 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
276b0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
276c0 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20   pAmt);.}.const 
276d0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
276e0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
276f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
27700 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
27710 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
27720 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
27730 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
27740 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
27750 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
27760 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
27770 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
27780 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
27790 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
277a0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
277b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
277c0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
277d0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
277e0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
277f0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
27800 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
27810 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
27820 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
27830 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
27840 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
27850 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
27860 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
27870 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
27880 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
27890 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
278a0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
278b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
278c0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
278d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
278e0 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
278f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27900 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27910 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27920 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
27930 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
27940 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
27950 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
27960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27970 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
27980 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
27990 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
279a0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
279b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
279c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
279d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
279e0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
279f0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
27a00 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
27a10 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
27a20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
27a30 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27a40 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a  ur->iPage] = 0;.
27a50 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49    return getAndI
27a60 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
27a70 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50  Pgno, &pCur->apP
27a80 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27a90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27aa0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20            pCur, 
27ab0 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
27ac0 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ags);.}..#if SQL
27ad0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
27ae0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
27af0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
27b00 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
27b10 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
27b20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
27b30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
27b40 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
27b50 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
27b60 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
27b70 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
27b80 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
27b90 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
27ba0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
27bb0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
27bc0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
27bd0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
27be0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
27bf0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
27c00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
27c10 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
27c20 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
27c30 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
27c40 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
27c50 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
27c60 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
27c70 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
27c80 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
27c90 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
27cb0 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
27cc0 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
27cd0 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
27ce0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
27cf0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
27d00 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
27d10 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
27d20 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
27d30 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
27d40 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
27d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
27d60 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
27d70 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
27d80 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
27d90 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
27da0 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
27db0 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
27dc0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
27dd0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
27de0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
27df0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
27e00 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
27e10 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
27e20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
27e30 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
27e40 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
27e50 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
27e60 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
27e70 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
27e80 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
27e90 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
27ea0 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
27eb0 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
27ec0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
27ed0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
27ee0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
27ef0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27f00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27f10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27f20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27f30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27f40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
27f50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27f60 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
27f70 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
27f80 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
27f90 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
27fa0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
27fb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27fc0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
27fd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27fe0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
27ff0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28000 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
28010 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
28020 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28030 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
28040 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28050 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
28060 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
28070 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
28080 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
28090 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
280a0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
280b0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
280c0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
280d0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
280e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
280f0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
28100 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
28110 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
28120 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
28130 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
28140 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
28150 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
28160 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
28170 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
28180 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
28190 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
281a0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
281b0 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
281c0 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
281d0 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
281e0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
281f0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
28200 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
28210 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
28220 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
28230 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
28240 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
28250 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
28260 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
28270 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
28280 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
28290 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
282a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
282b0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
282c0 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
282d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
282e0 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
282f0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
28300 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
28310 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
28320 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
28330 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
28340 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
28350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
28360 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
28370 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
28380 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
28390 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
283a0 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
283b0 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
283c0 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
283d0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
283e0 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
283f0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
28400 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
28410 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
28420 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
28430 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
28440 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
28450 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
28460 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
28470 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
28480 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
28490 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
284a0 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
284b0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
284c0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
284d0 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
284e0 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
284f0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
28500 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
28510 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
28520 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
28530 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
28540 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
28550 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
28560 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28570 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28580 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
28590 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
285a0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
285b0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
285c0 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
285d0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
285e0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
285f0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
28600 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28610 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28620 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
28630 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
28640 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28650 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
28660 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28670 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
28680 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
28690 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
286a0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
286b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
286c0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
286d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
286e0 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
286f0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
28700 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  age ){.      ass
28710 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
28720 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
28730 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  0 );.      relea
28740 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
28750 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28760 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20  >iPage--]);.    
28770 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
28780 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28790 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
287a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
287b0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
287c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
287d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
287e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
287f0 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
28800 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
28810 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
28820 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
28830 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
28840 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
28850 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
28860 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
28870 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
28880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28890 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
288a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
288b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
288c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
288d0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
288e0 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
288f0 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  y = pCur->apPage
28900 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d  [0]->intKey;.  }
28910 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
28920 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
28930 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
28940 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
28950 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
28960 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
28970 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
28980 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
28990 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
289a0 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
289b0 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
289c0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
289d0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
289e0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
289f0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
28a00 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
28a10 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
28a20 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
28a30 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
28a40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
28a50 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
28a60 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
28a70 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
28a80 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
28a90 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
28aa0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
28ab0 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
28ac0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
28ad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
28ae0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
28af0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
28b00 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
28b10 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
28b20 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
28b30 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
28b40 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
28b50 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
28b60 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
28b70 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
28b80 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
28b90 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
28ba0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
28bb0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
28bc0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
28bd0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
28be0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
28bf0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
28c00 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
28c10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28c20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28c30 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
28c40 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
28c50 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
28c60 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
28c70 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
28c80 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
28c90 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
28ca0 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
28cb0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
28cc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28cd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
28ce0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
28cf0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
28d00 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
28d10 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
28d20 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
28d30 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28d40 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
28d50 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
28d60 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
28d70 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
28d80 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28d90 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
28da0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
28db0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
28dc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
28dd0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28de0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28df0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
28e00 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
28e10 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
28e20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
28e30 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
28e40 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
28e50 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
28e60 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
28e70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
28e80 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
28e90 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
28ea0 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
28eb0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
28ec0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
28ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28ee0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
28ef0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
28f00 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
28f10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28f20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
28f30 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28f40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28f50 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28f60 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
28f70 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
28f80 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
28f90 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
28fa0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28fb0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
28fc0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
28fd0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
28fe0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
28ff0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
29000 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
29010 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
29020 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29030 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
29040 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29050 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
29060 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29070 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29080 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
29090 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
290a0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
290b0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
290c0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
290d0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
290e0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
290f0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
29100 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
29110 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
29120 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
29130 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
29140 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
29150 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
29160 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
29170 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
29180 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
29190 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
291a0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
291b0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
291c0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
291d0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
291e0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
291f0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
29200 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
29210 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29220 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
29230 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
29240 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
29250 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
29260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
29270 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
29280 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29290 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
292a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
292b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
292c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
292d0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
292e0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
292f0 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29300 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
29310 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29320 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29330 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
29340 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29350 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29360 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
29370 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29380 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
29390 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
293a0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
293b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
293c0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
293d0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
293e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
293f0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29400 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29410 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29420 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
29430 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29440 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29450 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
29460 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29470 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29480 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29490 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
294a0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
294b0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
294c0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
294d0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
294e0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
294f0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29500 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
29510 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
29520 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29530 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
29540 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29550 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
29560 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29570 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
29580 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
29590 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
295a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
295b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
295c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
295d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
295e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
295f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29600 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
29610 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
29620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
29630 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Cell==0 );.     
29640 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
29650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
29660 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
29670 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
29680 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
29690 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
296a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
296b0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
296c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
296d0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
296e0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
296f0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
29700 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
29710 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
29720 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
29730 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
29740 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
29750 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
29760 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
29770 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
29780 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
29790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
297a0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
297b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
297c0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
297d0 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
297e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
297f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29810 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
29820 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
29830 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
29840 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
29850 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
29860 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
29870 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
29880 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
29890 72 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43  r->eState && (pC
298a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
298b0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29  TCF_AtLast)!=0 )
298c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
298d0 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
298e0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
298f0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
29900 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
29910 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
29920 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
29930 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
29940 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
29950 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
29960 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
29970 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
29980 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
29990 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
299a0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
299b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
299c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
299d0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
299e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
299f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29a00 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
29a10 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
29a20 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
29a30 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
29a40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29a50 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
29a60 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
29a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
29a90 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
29aa0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
29ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
29ac0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
29ad0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
29ae0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29af0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
29b00 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
29b10 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
29b20 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29b30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29b40 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
29b50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
29b60 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
29b70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
29b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29b90 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
29ba0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
29bb0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Last;.      }els
29bc0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  e{.        pCur-
29bd0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
29be0 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20  CF_AtLast;.     
29bf0 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }.   .    }.  }
29c00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29c10 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
29c20 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
29c30 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
29c40 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
29c50 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
29c60 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
29c70 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
29c80 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
29c90 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
29ca0 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
29cb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
29cc0 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
29cd0 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
29ce0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
29cf0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
29d00 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
29d10 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
29d20 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
29d30 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
29d40 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
29d50 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
29d60 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
29d70 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
29d80 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
29d90 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
29da0 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
29db0 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
29dc0 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
29dd0 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
29de0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
29df0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
29e00 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
29e10 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
29e20 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
29e30 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
29e40 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
29e50 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
29e60 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
29e70 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
29e80 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
29e90 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
29ea0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
29eb0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
29ec0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
29ed0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
29ee0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
29ef0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
29f00 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
29f10 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
29f20 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
29f30 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
29f40 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
29f50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
29f60 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
29f70 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
29f80 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
29f90 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
29fa0 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
29fb0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
29fc0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
29fd0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
29ff0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
2a000 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a010 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
2a020 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
2a030 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a040 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a050 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a060 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
2a070 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2a080 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
2a090 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2a0a0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2a0b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a0c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2a0d0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2a0e0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2a0f0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2a100 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2a110 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2a120 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2a130 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2a140 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2a150 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2a160 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2a170 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2a180 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2a190 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2a1b0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2a1c0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2a1d0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2a1e0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2a1f0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2a200 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2a210 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2a220 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a230 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2a240 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2a250 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2a260 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72   pRes );.  asser
2a270 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  t( (pIdxKey==0)=
2a280 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  =(pCur->pKeyInfo
2a290 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
2a2a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2a2b0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2a2c0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2a2d0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2a2e0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2a2f0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2a300 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2a310 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2a320 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a330 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43  SOR_VALID && (pC
2a340 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2a350 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d  TCF_ValidNKey)!=
2a360 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63 75  0.   && pCur->cu
2a370 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  rIntKey .  ){.  
2a380 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2a390 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2a3a0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
2a3b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2a3c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2a3d0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
2a3e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
2a3f0 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75  tLast)!=0 && pCu
2a400 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
2a410 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2a420 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
2a430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a440 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2a450 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
2a460 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2a470 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  = sqlite3VdbeFin
2a480 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79  dCompare(pIdxKey
2a490 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e  );.    pIdxKey->
2a4a0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20  errCode = 0;.   
2a4b0 20 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79   assert( pIdxKey
2a4c0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20  ->default_rc==1 
2a4d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2a4e0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2a4f0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==0 .         ||
2a500 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2a510 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a  t_rc==-1.    );.
2a520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65    }else{.    xRe
2a530 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b  cordCompare = 0;
2a540 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65   /* All keys are
2a550 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d   integers */.  }
2a560 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
2a570 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
2a580 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
2a590 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2a5a0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2a5b0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2a5c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a5d0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
2a5e0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2a5f0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2a600 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2a610 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
2a620 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2a630 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2a640 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2a650 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a660 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
2a670 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a680 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
2a690 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2a6a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a6b0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a6c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a6d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2a6e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
2a6f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a700 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2a710 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2a720 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2a730 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2a740 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2a750 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2a760 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2a770 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2a780 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2a790 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2a7a0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2a7b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a7c0 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  age];.    u8 *pC
2a7d0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a7f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
2a800 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
2a810 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61  e */..    /* pPa
2a820 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
2a830 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
2a840 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
2a850 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
2a860 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
2a870 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
2a880 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
2a890 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
2a8a0 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
2a8b0 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
2a8c0 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
2a8d0 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
2a8e0 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
2a8f0 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
2a900 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
2a910 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
2a920 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
2a930 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
2a940 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
2a950 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
2a960 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
2a970 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
2a980 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
2a990 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
2a9a0 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
2a9b0 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
2a9c0 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
2a9d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2a9e0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
2a9f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2aa00 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
2aa10 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
2aa20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
2aa30 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
2aa40 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67   assert( biasRig
2aa50 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67  ht==0 || biasRig
2aa60 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78  ht==1 );.    idx
2aa70 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52   = upr>>(1-biasR
2aa80 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20  ight); /* idx = 
2aa90 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20  biasRight ? upr 
2aaa0 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  : (lwr+upr)/2; *
2aab0 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  /.    pCur->aiId
2aac0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2aad0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69   (u16)idx;.    i
2aae0 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  f( xRecordCompar
2aaf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==0 ){.      fo
2ab00 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2ab10 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
2ab20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2ab30 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2ab40 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20  ge, idx);.      
2ab50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2ab60 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  KeyLeaf ){.     
2ab70 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
2ab80 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
2ab90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2aba0 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
2abb0 61 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72  aDataEnd ) retur
2abc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2abd0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2abe0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2abf0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
2ac00 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
2ac10 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2ac20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
2ac30 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2ac40 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2ac50 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2ac60 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
2ac70 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2ac80 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
2ac90 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
2aca0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2acb0 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
2acc0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2acd0 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
2ace0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2acf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2ad00 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
2ad10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
2ad20 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2ad30 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
2ad40 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2ad50 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
2ad60 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
2ad70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2ad80 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2ad90 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2ada0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2adb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2adc0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2add0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ade0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2adf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2ae00 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
2ae10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2ae20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ae30 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2ae40 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2ae50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ae60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2ae70 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2ae80 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2ae90 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2aea0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2aeb0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2aec0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2aed0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2aee0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2aef0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2af00 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2af10 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2af20 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2af30 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2af40 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2af50 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2af60 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2af70 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2af80 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2af90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2afa0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2afb0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2afc0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2afd0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2afe0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2aff0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2b000 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2b010 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2b020 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2b030 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2b040 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2b050 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2b060 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2b070 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2b080 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2b090 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2b0a0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2b0b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2b0c0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2b0d0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2b0e0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2b0f0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2b100 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2b110 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2b120 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2b130 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2b140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2b150 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2b160 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2b170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2b180 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2b190 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2b1a0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2b1b0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2b1c0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2b1d0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2b1e0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2b1f0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2b200 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2b210 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2b220 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b230 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2b240 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2b250 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2b260 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2b270 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2b280 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2b290 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2b2a0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2b2b0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2b2c0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2b2d0 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2b2e0 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2b2f0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2b300 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2b310 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2b320 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2b330 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2b340 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2b350 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2b360 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2b370 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2b380 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2b390 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2b3a0 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2b3b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2b3c0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2b3d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2b3e0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2b3f0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2b400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b410 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2b420 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2b430 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2b440 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2b450 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2b460 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2b470 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2b480 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2b490 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2b4a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2b4b0 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2b4c0 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2b4d0 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2b4e0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2b4f0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2b500 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2b510 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2b520 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2b530 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2b540 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2b550 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2b560 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2b570 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2b580 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2b590 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2b5a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2b5b0 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2b5c0 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2b5d0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2b5e0 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2b5f0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2b600 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2b610 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2b620 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2b630 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2b640 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2b650 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2b660 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2b670 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2b680 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2b690 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2b6a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2b6b0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2b6c0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2b6d0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2b6e0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2b6f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b700 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2b710 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2b720 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2b730 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2b740 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2b750 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2b760 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2b770 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2b780 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2b790 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2b7a0 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2b7b0 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2b7c0 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2b7d0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2b7e0 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2b7f0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2b800 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2b810 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2b820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b830 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2b840 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2b850 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2b860 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2b870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b880 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
2b890 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b  e3Malloc( nCell+
2b8a0 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  18 );.          
2b8b0 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
2b8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2b8d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2b8e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2b8f0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2b900 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b910 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2b920 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b930 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b940 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
2b950 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
2b960 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
2b970 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
2b980 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  ey, 2);.        
2b990 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b9a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b9b0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b9d0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b9e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b9f0 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2ba00 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2ba10 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
2ba20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
2ba30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
2ba40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
2ba50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ba60 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49  .            (pI
2ba70 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2ba80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
2ba90 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  | c==0).        
2baa0 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72   && (pIdxKey->er
2bab0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f  rCode!=SQLITE_NO
2bac0 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74  MEM || pCur->pBt
2bad0 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ree->db->mallocF
2bae0 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29  ailed).        )
2baf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c  ;.        if( c<
2bb00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
2bb10 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2bb20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
2bb30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
2bb40 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2bb50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bb60 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d       assert( c==
2bb70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 );.          *
2bb80 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2bb90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bba0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  OK;.          pC
2bbb0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bbc0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2bbd0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2bbe0 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2bbf0 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  e ) rc = SQLITE_
2bc00 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
2bc10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2bc20 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
2bc30 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
2bc40 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  >upr ) break;.  
2bc50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
2bc60 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
2bc70 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
2bc80 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
2bc90 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f  = (lwr+upr)/2 */
2bca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2bcb0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
2bcc0 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
2bcd0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2bce0 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
2bcf0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2bd00 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
2bd10 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2bd20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2bd30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2bd40 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
2bd50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2bd60 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
2bd70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2bd80 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2bd90 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
2bda0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
2bdb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bdc0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2bdd0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
2bde0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
2bdf0 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
2be00 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2be10 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2be20 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2be30 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2be40 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2be50 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
2be60 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2be70 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
2be80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
2be90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2bea0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
2beb0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2bec0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
2bed0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
2bee0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
2bef0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
2bf00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2bf10 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2bf20 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2bf30 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2bf40 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74  alidOvfl);.  ret
2bf50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2bf60 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2bf70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
2bf80 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
2bf90 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
2bfa0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
2bfb0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
2bfc0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
2bfd0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
2bfe0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
2bff0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
2c000 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
2c010 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
2c020 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
2c030 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
2c040 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
2c050 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
2c060 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2c070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c080 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
2c090 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
2c0a0 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
2c0b0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
2c0c0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2c0d0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
2c0e0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
2c0f0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
2c100 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
2c110 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
2c120 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
2c130 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
2c140 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
2c150 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
2c160 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
2c170 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
2c180 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
2c190 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
2c1a0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
2c1b0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2c1c0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2c1d0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2c1e0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2c1f0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2c200 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2c210 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
2c220 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2c230 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2c240 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2c250 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2c260 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2c270 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2c280 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2c290 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2c2a0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2c2b0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2c2c0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2c2d0 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2c2e0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2c2f0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2c300 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2c310 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2c320 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2c330 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2c340 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2c350 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2c360 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2c370 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2c380 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2c390 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2c3a0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2c3b0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2c3c0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2c3d0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2c3e0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2c3f0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2c400 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2c410 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2c420 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2c430 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2c440 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2c450 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2c460 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2c470 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2c480 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2c490 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2c4a0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2c4b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2c4c0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2c4d0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2c4e0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2c4f0 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2c500 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2c510 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2c520 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2c530 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2c540 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2c550 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2c560 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2c570 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2c580 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2c590 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2c5a0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2c5b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2c5c0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2c5d0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2c5e0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2c5f0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2c600 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2c610 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2c620 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2c630 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2c640 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2c650 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2c660 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2c670 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2c680 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2c690 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2c6a0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2c6b0 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20  t( *pRes==0 );. 
2c6c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2c6d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c6e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2c6f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c700 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2c710 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2c720 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2c730 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2c740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2c760 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2c770 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2c780 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2c790 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2c7a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2c7b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c7c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2c7d0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2c7e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c7f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c800 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2c810 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2c820 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2c830 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2c840 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2c850 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2c860 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
2c870 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2c880 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2c890 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c8a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c8b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2c8c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2c8d0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2c8e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c8f0 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43  e];.  idx = ++pC
2c900 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c910 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
2c920 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2c930 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2c940 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2c950 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
2c960 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
2c970 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
2c980 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
2c990 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
2c9a0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
2c9b0 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
2c9c0 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
2c9d0 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
2c9e0 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
2c9f0 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
2ca00 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
2ca10 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
2ca20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ca30 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
2ca40 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
2ca50 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
2ca60 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
2ca70 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
2ca80 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
2ca90 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
2caa0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
2cab0 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
2cac0 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
2cad0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2cae0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
2caf0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2cb00 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2cb10 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2cb20 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2cb30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2cb40 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2cb50 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2cb60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2cb70 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
2cb80 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2cb90 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2cba0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
2cbb0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2cbc0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2cbd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cbe0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2cbf0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
2cc00 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
2cc10 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2cc20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2cc30 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
2cc40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2cc50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
2cc60 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ll );.    if( pP
2cc70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2cc80 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
2cc90 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2cca0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2ccb0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
2ccc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ccd0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61   }.  }.  if( pPa
2cce0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ccf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cd00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2cd10 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2cd20 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2cd30 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2cd40 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
2cd50 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2cd60 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2cd70 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  age;.  assert( c
2cd80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2cd90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2cda0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2cdb0 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2cdc0 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2cdd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cde0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2cdf0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2ce00 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
2ce10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2ce20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2ce30 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2ce40 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2ce50 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
2ce60 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
2ce70 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ce80 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2ce90 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2cea0 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
2ceb0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2cec0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ced0 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49  if( (++pCur->aiI
2cee0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
2cef0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2cf00 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
2cf10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2cf20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
2cf30 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2cf40 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
2cf50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2cf60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cf70 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2cf80 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2cf90 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2cfa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2cfb0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2cfc0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2cfd0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2cfe0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2cff0 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2d000 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2d010 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2d020 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2d030 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
2d040 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
2d050 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2d060 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2d070 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2d080 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2d090 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2d0a0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2d0b0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2d0c0 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
2d0d0 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2d0e0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2d0f0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2d100 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
2d110 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2d120 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2d130 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
2d140 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
2d150 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2d160 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
2d170 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
2d180 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
2d190 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2d1a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2d1b0 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2d1c0 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
2d1d0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2d1e0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2d1f0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2d200 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2d210 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2d220 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2d230 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2d240 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2d250 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2d260 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2d270 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2d280 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2d290 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2d2a0 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2d2b0 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2d2c0 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2d2d0 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2d2e0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2d2f0 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2d300 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2d310 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2d320 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2d330 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2d340 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2d350 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2d360 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2d370 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2d380 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2d390 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2d3a0 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2d3b0 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2d3c0 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2d3d0 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2d3e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2d3f0 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2d400 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2d410 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2d420 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2d430 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2d440 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d450 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2d460 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d470 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2d480 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2d490 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d4a0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2d4b0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2d4c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d4d0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2d4e0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d4f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2d500 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2d510 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2d520 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2d530 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2d540 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61  NKey))==0 );.  a
2d550 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2d560 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
2d570 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2d580 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2d590 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  {.    rc = resto
2d5a0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d5b0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2d5c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d5d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2d5e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d5f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2d600 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2d610 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2d620 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d630 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d640 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2d650 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2d660 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2d670 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2d680 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2d690 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2d6a0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2d6b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2d6c0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2d6d0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2d6e0 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
2d6f0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2d700 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2d710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d720 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2d730 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2d740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2d750 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2d760 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2d770 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d780 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
2d790 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d7a0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
2d7b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d7c0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
2d7d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2d7e0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
2d7f0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
2d800 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
2d810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2d820 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2d830 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
2d840 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2d850 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d860 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
2d870 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2d880 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2d890 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2d8a0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2d8b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
2d8c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
2d8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2d8f0 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2d900 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2d910 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2d920 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ize==0 );.    as
2d930 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2d940 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61  Flags & (BTCF_Va
2d950 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2d960 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a  idOvfl))==0 );..
2d970 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2d980 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2d990 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2d9a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d9b0 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
2d9c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
2d9d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d9e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d9f0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2da00 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
2da10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2da20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2da30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2da40 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   rc;.}.int sqlit
2da50 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2da60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2da70 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73  int *pRes){.  as
2da80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2da90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2daa0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2dab0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2dac0 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2dad0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2dae0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2daf0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2db00 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2db10 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b   );.  *pRes = 0;
2db20 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2db30 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2db40 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2db50 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2db60 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2db70 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
2db80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2db90 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
2dba0 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  | pCur->aiIdx[pC
2dbb0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20  ur->iPage]==0.  
2dbc0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2dbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
2dbe0 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  eaf==0.  ){.    
2dbf0 72 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76  return btreePrev
2dc00 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2dc10 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69  ;.  }.  pCur->ai
2dc20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2dc30 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
2dc40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2dc50 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
2dc60 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
2dc70 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
2dc80 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
2dc90 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
2dca0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
2dcb0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
2dcc0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
2dcd0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2dce0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
2dcf0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
2dd00 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
2dd10 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
2dd20 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
2dd30 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
2dd40 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
2dd50 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
2dd60 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
2dd70 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
2dd80 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
2dd90 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2dda0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
2ddb0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
2ddc0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
2ddd0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
2dde0 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73  r.  *ppPage is s
2ddf0 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
2de00 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
2de10 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
2de20 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
2de30 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
2de40 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73  hen an effort is
2de50 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
2de60 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
2de70 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
2de80 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
2de90 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2dea0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
2deb0 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
2dec0 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
2ded0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
2dee0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2def0 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
2df00 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
2df10 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
2df20 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
2df30 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
2df40 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  is BTALLOC_EXACT
2df50 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20   and the nearby 
2df60 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61  page exists.** a
2df70 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
2df80 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
2df90 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
2dfa0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
2dfb0 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20   If.** eMode is 
2dfc0 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20  BTALLOC_LT then 
2dfd0 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65  the page returne
2dfe0 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74  d will be less t
2dff0 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
2e000 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79  to nearby if any
2e010 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
2e020 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20  s.  If eMode is 
2e030 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e  BTALLOC_ANY then
2e040 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
2e050 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e   restrictions on
2e060 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72   which page is r
2e070 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2e080 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
2e090 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
2e0a0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
2e0b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
2e0c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
2e0d0 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53  pPage,      /* S
2e0e0 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tore pointer to 
2e0f0 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
2e100 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  ge here */.  Pgn
2e110 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20  o *pPgno,       
2e120 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
2e130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72   page number her
2e140 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72  e */.  Pgno near
2e150 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  by,           /*
2e160 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61   Search for a pa
2e170 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65  ge near this one
2e180 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20   */.  u8 eMode  
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1a0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42  BTALLOC_EXACT, B
2e1b0 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54  TALLOC_LT, or BT
2e1c0 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a  ALLOC_ANY */.){.
2e1d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e1e0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
2e1f0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
2e200 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2e210 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2e220 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
2e230 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
2e240 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
2e250 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
2e260 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
2e270 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
2e280 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
2e290 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
2e2a0 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
2e2b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2e2c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
2e2d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2e2e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2e2f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2e300 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
2e310 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
2e320 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41  >0 && IfNotOmitA
2e330 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  V(pBt->autoVacuu
2e340 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  m)) );.  pPage1 
2e350 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
2e360 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
2e370 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
2e380 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2e390 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54   R-05119-02637 T
2e3a0 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
2e3b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
2e3c0 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73  offset 36.  ** s
2e3d0 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65  tores stores the
2e3e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2e3f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2e400 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d  eelist. */.  n =
2e410 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2e420 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
2e430 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
2e440 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
2e450 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
2e460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2e470 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2e480 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
2e490 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
2e4a0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2e4b0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
2e4c0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
2e4d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
2e4e0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
2e4f0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
2e500 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2e510 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
2e520 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
2e530 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
2e540 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
2e550 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
2e560 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
2e570 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
2e580 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
2e590 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
2e5a0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
2e5b0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
2e5c0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
2e5d0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
2e5e0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
2e5f0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
2e600 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2e610 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
2e620 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
2e630 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
2e640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e650 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2e660 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2e670 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
2e680 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
2e690 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2e6a0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
2e6b0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
2e6c0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
2e6d0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
2e6e0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
2e6f0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2e700 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
2e710 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
2e720 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e730 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
2e740 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
2e750 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
2e760 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2e770 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2e780 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e790 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
2e7a0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
2e7b0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2e7c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2e7d0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
2e7e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
2e7f0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
2e800 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
2e810 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
2e820 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
2e830 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
2e840 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
2e850 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
2e860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e870 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
2e880 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2e890 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2e8a0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
2e8b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e8c0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
2e8d0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
2e8e0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
2e8f0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
2e900 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
2e910 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
2e920 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
2e930 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
2e940 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
2e950 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
2e960 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
2e970 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
2e980 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2e990 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2e9a0 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
2e9b0 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
2e9c0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
2e9d0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2e9e0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2e9f0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
2ea00 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
2ea10 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
2ea20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
2ea30 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2ea40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ea50 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
2ea60 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
2ea70 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
2ea80 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
2ea90 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
2eaa0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
2eab0 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
2eac0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
2ead0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
2eae0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
2eaf0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
2eb00 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
2eb10 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
2eb20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
2eb30 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2eb40 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2eb50 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
2eb60 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
2eb70 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
2eb80 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2eb90 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2eba0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
2ebb0 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
2ebc0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
2ebd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
2ebe0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
2ebf0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
2ec00 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
2ec10 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
2ec20 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2ec30 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2ec40 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
2ec50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
2ec60 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
2ec70 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
2ec80 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
2ec90 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
2eca0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ecb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ecc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ecd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ece0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2ecf0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2ed00 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2ed10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ed20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2ed30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2ed40 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2ed50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2ed60 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
2ed70 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ed80 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
2ed90 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45  =0 );.      /* E
2eda0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33  VIDENCE-OF: R-13
2edb0 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65  523-04394 The se
2edc0 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20  cond integer on 
2edd0 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
2ede0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
2edf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2ee00 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65  leaf page pointe
2ee10 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f  rs to follow. */
2ee20 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
2ee30 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2ee40 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66  ta[4]);.      if
2ee50 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
2ee60 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
2ee70 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
2ee80 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
2ee90 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
2eea0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
2eeb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
2eec0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
2eed0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
2eee0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
2eef0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
2ef00 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2ef10 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
2ef20 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
2ef30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
2ef40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ef50 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2ef60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2ef70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2ef80 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2ef90 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2efa0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
2efb0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
2efc0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2efd0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
2efe0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2eff0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
2f000 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
2f010 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2f020 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
2f030 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
2f040 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
2f050 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
2f060 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
2f070 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
2f080 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
2f090 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
2f0a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
2f0b0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
2f0c0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
2f0d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
2f0e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f0f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f100 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
2f110 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f120 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2f130 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f140 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2f150 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20   searchList .   
2f160 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61           && (nea
2f170 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28  rby==iTrunk || (
2f180 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26  iTrunk<nearby &&
2f190 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2f1a0 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  LE)) .      ){. 
2f1b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
2f1c0 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
2f1d0 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
2f1e0 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
2f1f0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2f200 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
2f210 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2f220 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
2f230 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2f240 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
2f250 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70  runk;.        *p
2f260 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
2f270 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2f280 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2f290 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f2a0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2f2b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2f2c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f2d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f2e0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f300 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
2f310 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
2f320 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
2f330 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2f340 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
2f350 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2f360 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2f370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2f380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f390 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
2f3a0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2f3b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f3c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f3d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
2f3e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2f3f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2f400 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f410 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
2f420 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
2f430 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
2f440 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
2f450 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2f460 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2f470 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
2f480 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
2f490 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
2f4a0 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
2f4b0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
2f4c0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
2f4d0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
2f4e0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
2f4f0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
2f500 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
2f510 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
2f520 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
2f530 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
2f540 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
2f550 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
2f560 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2f570 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
2f580 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
2f590 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
2f5a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f5b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f5c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2f5d0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2f5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f5f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2f600 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
2f610 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
2f620 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
2f630 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e  usedPage(pBt, iN
2f640 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
2f650 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
2f660 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f680 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f690 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f6b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f6c0 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
2f6d0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2f6e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2f6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f700 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2f710 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2f720 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f730 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f740 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2f750 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2f760 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2f770 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2f780 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2f790 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2f7a0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
2f7b0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2f7c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f7d0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2f7e0 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
2f7f0 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
2f800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
2f810 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2f820 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
2f830 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2f840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2f850 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2f860 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2f870 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
2f880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
2f890 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2f8a0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
2f8b0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2f8c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f8d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f8e0 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2f8f0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f910 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2f920 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f930 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2f950 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2f960 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2f970 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
2f980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2f990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f9a0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f9b0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2f9c0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2f9d0 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2f9e0 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2f9f0 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
2fa00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
2fa10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
2fa20 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
2fa30 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
2fa40 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
2fa50 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
2fa60 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
2fa70 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2fa80 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
2fa90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
2faa0 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
2fab0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
2fac0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
2fad0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2fae0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2faf0 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2fb00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2fb10 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2fb20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
2fb30 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
2fb40 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
2fb50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
2fb60 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
2fb80 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
2fb90 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2fba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2fbb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2fbc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2fbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2fbe0 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
2fbf0 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
2fc00 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
2fc10 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
2fc20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
2fc30 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
2fc40 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2fc50 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
2fc60 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
2fc70 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2fc80 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
2fc90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2fca0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
2fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcc0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2fcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
2fce0 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
2fcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fd00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fd10 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2fd20 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
2fd30 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2fd40 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
2fd50 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2fd60 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
2fd70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2fd80 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2fd90 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2fda0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
2fdb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2fdc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fdd0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2fde0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2fdf0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2fe00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2fe10 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
2fe20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2fe30 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
2fe40 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
2fe50 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
2fe60 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
2fe70 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2fe80 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2fe90 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
2fea0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
2feb0 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
2fec0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
2fed0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
2fee0 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
2fef0 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
2ff10 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
2ff20 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
2ff30 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
2ff40 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
2ff50 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
2ff60 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
2ff70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ff80 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2ff90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2ffa0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2ffb0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2ffc0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ffd0 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
2ffe0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2fff0 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
30000 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
30010 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
30020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30030 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
30040 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
30050 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
30060 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
30070 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
30080 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
30090 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20  NTENT : 0;.     
300a0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
300b0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
300c0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
300d0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
300e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
300f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30100 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30110 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30120 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
30130 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30160 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30170 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
30180 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
30190 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
301a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
301b0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
301c0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
301d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
301e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
301f0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
30200 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
30210 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
30220 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
30230 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
30240 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
30250 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
30260 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
30270 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
30280 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
30290 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
302a0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
302b0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
302c0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
302d0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
302e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
302f0 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
30300 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
30310 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
30320 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
30330 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
30340 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
30350 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
30360 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
30370 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
30380 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
30390 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
303a0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
303b0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
303c0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
303d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
303e0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
303f0 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
30400 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
30410 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
30420 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
30430 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
30440 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
30450 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
30460 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
30470 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
30480 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
30490 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
304a0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
304b0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
304c0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
304d0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
304e0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
304f0 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
30500 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
30510 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
30520 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
30530 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
30540 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
30550 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
30560 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
30570 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
30580 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
30590 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
305a0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
305b0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
305c0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
305d0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
305e0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
305f0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
30600 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
30610 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
30620 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
30630 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30640 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
30650 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
30660 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
30670 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
30680 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
30690 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
306a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
306b0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
306c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
306d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
306e0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
306f0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
30700 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
30710 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30720 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
30730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30740 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30750 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
30760 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
30770 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
30780 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
30790 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
307a0 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
307b0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
307c0 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
307d0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
307e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
307f0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
30800 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
30810 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
30820 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
30830 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
30840 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
30850 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
30860 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
30870 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
30880 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
30890 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
308a0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
308b0 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
308c0 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
308d0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
308e0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
308f0 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
30900 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
30910 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
30920 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
30930 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50   pBt->nPage, &pP
30940 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  g, bNoContent);.
30950 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30980 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
30990 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
309a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
309b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
309c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
309d0 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   rc;.      pBt->
309e0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
309f0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
30a00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
30a10 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50  (pBt) ){ pBt->nP
30a20 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23  age++; }.    }.#
30a30 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79  endif.    put4by
30a40 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74  te(28 + (u8*)pBt
30a50 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  ->pPage1->aData,
30a60 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
30a70 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
30a80 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65  nPage;..    asse
30a90 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
30aa0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30ab0 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  t) );.    rc = b
30ac0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
30ad0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
30ae0 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
30af0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
30b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30b10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30b20 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
30b30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30b50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
30b60 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
30b70 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
30b80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52   0;.    }.    TR
30b90 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
30ba0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
30bb0 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
30bc0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
30bd0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
30be0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
30bf0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
30c00 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
30c10 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
30c20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
30c30 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72  vTrunk);.  asser
30c40 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
30c50 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
30c60 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
30c70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
30c80 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=1 );.  assert(
30c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
30ca0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  | (*ppPage)->isI
30cb0 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  nit==0 );.  retu
30cc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30cd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30ce0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
30cf0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
30d00 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
30d10 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
30d20 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
30d30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
30d40 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
30d50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
30d60 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
30d70 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
30d80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
30d90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30da0 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
30db0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
30dc0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
30dd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
30de0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
30df0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
30e00 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
30e10 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
30e20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
30e30 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
30e40 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
30e50 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
30e60 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
30e70 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
30e80 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
30e90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
30ea0 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
30eb0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
30ec0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
30ed0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
30ee0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
30ef0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
30f00 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
30f10 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
30f20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
30f30 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
30f40 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
30f50 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
30f60 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
30f70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30f80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
30f90 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
30fa0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
30fb0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
30fc0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
30fd0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
30fe0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
30ff0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
31000 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
31010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31020 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
31030 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
31040 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
31050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31070 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
31080 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
310b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
310c0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
310d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
310e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
310f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
31100 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
31110 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  | iPage>1 );.  a
31120 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
31130 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
31140 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
31150 69 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65  if( iPage<2 ) re
31160 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31170 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20  UPT_BKPT;.  if( 
31180 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
31190 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
311a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
311b0 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
311c0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
311d0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
311e0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
311f0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
31200 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
31210 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
31220 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
31230 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31240 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
31250 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
31260 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
31270 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
31280 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
31290 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
312a0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
312b0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
312c0 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
312d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
312e0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
312f0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
31300 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
31310 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
31320 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
31330 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
31340 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
31350 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
31360 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
31370 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
31380 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
31390 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
313a0 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
313b0 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
313c0 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
313d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
313e0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
313f0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
31400 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31410 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
31420 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
31430 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
31440 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
31450 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
31460 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
31470 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
31480 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
31490 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
314a0 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
314b0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
314c0 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
314d0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
314e0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
314f0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
31500 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
31510 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
31520 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
31530 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
31540 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
31550 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
31560 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
31570 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
31580 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
31590 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
315a0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
315b0 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
315c0 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
315d0 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
315e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
315f0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
31600 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
31610 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
31620 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
31630 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
31640 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
31650 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
31660 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
31670 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
31680 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
31690 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
316a0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
316b0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
316c0 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
316d0 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
316e0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
316f0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
31700 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
31710 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
31720 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
31730 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
31740 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
31750 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
31760 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
31770 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31780 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
31790 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
317a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
317b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
317c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
317d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
317e0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
317f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
31800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
31810 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
31820 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
31830 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
31840 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
31850 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
31860 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31870 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31880 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31890 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
318a0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
318b0 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
318c0 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
318d0 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
318e0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
318f0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
31900 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
31910 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
31920 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
31930 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
31940 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
31950 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
31960 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
31970 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
31980 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
31990 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
319a0 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
319b0 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
319c0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
319d0 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
319e0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
319f0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
31a00 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
31a10 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
31a20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
31a30 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
31a40 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
31a50 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
31a60 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
31a70 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
31a80 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
31a90 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
31aa0 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
31ab0 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
31ac0 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
31ad0 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
31ae0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
31af0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
31b00 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
31b10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
31b20 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
31b30 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
31b40 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
31b50 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
31b60 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
31b70 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
31b80 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
31b90 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
31ba0 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
31bb0 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
31bc0 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
31bd0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
31be0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
31bf0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
31c00 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
31c10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
31c20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
31c30 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f  R-19920-11576 Ho
31c40 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72  wever, newer ver
31c50 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
31c60 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61  still.      ** a
31c70 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c  void using the l
31c80 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20  ast six entries 
31c90 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  in the freelist 
31ca0 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79  trunk page array
31cb0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
31cc0 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65  er that database
31cd0 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62   files created b
31ce0 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  y newer versions
31cf0 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62   of SQLite can b
31d00 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  e.      ** read 
31d10 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  by older version
31d20 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20  s of SQLite..   
31d30 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31d40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31d50 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
31d60 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
31d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31d80 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31d90 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
31da0 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
31db0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
31dc0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
31dd0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
31de0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
31df0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
31e00 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
31e10 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
31e20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
31e30 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
31e40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31e60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
31e70 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
31e80 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
31e90 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
31ea0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
31eb0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
31ec0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
31ed0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
31ee0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
31ef0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
31f00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
31f10 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
31f20 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
31f30 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
31f40 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
31f50 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
31f60 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
31f70 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
31f80 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
31f90 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
31fa0 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
31fb0 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
31fc0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
31fd0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
31fe0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
31ff0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
32000 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
32010 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
32020 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
32030 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
32040 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
32050 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
32060 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
32070 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
32080 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
32090 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
320a0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
320b0 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
320c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
320d0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
320e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
320f0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32100 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
32110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
32120 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32130 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
32140 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
32150 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
32160 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
32170 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
32180 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
32190 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
321a0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
321b0 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
321c0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
321d0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
321e0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
321f0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
32200 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
32210 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
32220 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
32230 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
32240 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
32250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
32260 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
32270 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
32280 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
32290 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
322a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
322b0 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
322c0 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
322d0 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
322e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
322f0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
32300 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
32310 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
32320 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68   Cell.  Write th
32330 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20  e.** local Cell 
32340 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72  size (the number
32350 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65   of bytes on the
32360 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20   original page, 
32370 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72  omitting.** over
32380 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69  flow) into *pnSi
32390 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
323a0 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
323b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
323c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
323d0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
323e0 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
323f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
32400 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
32410 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
32420 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53  ll */.  u16 *pnS
32430 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
32440 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69   /* Write the si
32450 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68  ze of the Cell h
32460 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ere */.){.  BtSh
32470 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
32480 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e  e->pBt;.  CellIn
32490 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20  fo info;.  Pgno 
324a0 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
324b0 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
324c0 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
324d0 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
324e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
324f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
32500 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
32510 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
32520 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
32530 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69  );.  *pnSize = i
32540 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28  nfo.nSize;.  if(
32550 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
32560 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
32570 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
32580 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
32590 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
325a0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
325b0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
325c0 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
325d0 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44  ow+3 > pPage->aD
325e0 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
325f0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
32600 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
32610 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
32620 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
32630 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
32640 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
32650 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
32660 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
32670 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
32680 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
32690 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
326a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
326b0 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
326c0 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
326d0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
326e0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
326f0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
32700 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
32710 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
32720 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50  T_DB && (info.nP
32730 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67  ayload + ovflPag
32740 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53  eSize)<ovflPageS
32750 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ize).  );.  whil
32760 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
32770 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
32780 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
32790 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
327a0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
327b0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
327c0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
327d0 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
327e0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
327f0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
32800 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
32810 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
32820 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
32830 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
32840 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
32850 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
32860 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
32870 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
32880 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
32890 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
328a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
328b0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
328c0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
328d0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
328e0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
328f0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
32900 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
32910 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
32920 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
32930 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
32940 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
32950 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
32960 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
32970 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
32980 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
32990 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
329a0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
329b0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
329c0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
329d0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
329e0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
329f0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
32a00 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
32a10 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
32a20 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
32a30 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
32a40 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
32a50 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
32a60 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
32a70 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
32a80 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
32a90 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
32aa0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
32ab0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
32ac0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
32ad0 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
32ae0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
32af0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
32b00 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
32b10 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
32b20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
32b30 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
32b40 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
32b50 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
32b60 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
32b70 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
32b80 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
32b90 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
32ba0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
32bb0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
32bc0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
32bd0 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
32be0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
32bf0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
32c00 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
32c10 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
32c20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32c30 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
32c40 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
32c50 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
32c60 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
32c70 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
32c80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32c90 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
32ca0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
32cb0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
32cc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
32cd0 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
32ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
32cf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32d00 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
32d10 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
32d20 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
32d30 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
32d40 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
32d50 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
32d60 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
32d70 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
32d80 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
32d90 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
32da0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
32db0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
32dc0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
32dd0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
32de0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
32df0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
32e00 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
32e10 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
32e20 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
32e30 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
32e40 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
32e50 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
32e60 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
32e70 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
32e80 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
32e90 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
32ea0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
32eb0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
32ec0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
32ed0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
32ee0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
32ef0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
32f00 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
32f10 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
32f20 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
32f30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
32f40 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
32f50 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
32f60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
32f70 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
32f80 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
32f90 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
32fa0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
32fb0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
32fc0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
32fd0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
32fe0 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
32ff0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
33000 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
33010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33020 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
33030 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
33040 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
33050 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
33060 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
33070 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
33080 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
33090 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
330a0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
330b0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
330c0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
330d0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
330e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
330f0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
33100 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
33110 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
33120 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
33130 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
33140 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
33150 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
33160 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
33170 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
33180 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33190 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
331a0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
331b0 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
331c0 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
331d0 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
331e0 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
331f0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
33200 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
33210 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
33220 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
33230 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
33240 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
33250 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
33260 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
33270 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
33280 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
33290 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
332a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
332b0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
332c0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
332d0 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
332e0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
332f0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
33300 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
33310 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
33320 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
33330 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
33340 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
33350 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
33360 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e{.    assert( n
33370 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Data==0 );.    a
33380 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20  ssert( nZero==0 
33390 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  );.  }.  nHeader
333a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
333b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
333c0 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
333d0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
333e0 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a  e payload size *
333f0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  /.  if( pPage->i
33400 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
33410 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
33420 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
33430 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
33440 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74  lse{ .    assert
33450 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ( nKey<=0x7fffff
33460 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29 3b  ff && pKey!=0 );
33470 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
33480 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
33490 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
334a0 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
334b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79  ;.  }.  if( nPay
334c0 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
334d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
334e0 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
334f0 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
33500 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
33510 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
33520 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
33530 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
33540 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
33550 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
33560 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
33570 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
33580 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
33590 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
335a0 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
335b0 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
335c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
335d0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
335e0 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
335f0 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
33600 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33610 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
33620 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
33630 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33640 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
33650 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
33660 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
33670 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
33680 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
33690 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
336a0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
336b0 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
336c0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
336d0 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
336e0 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
336f0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
33700 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
33710 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
33720 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
33730 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
33740 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
33750 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
33760 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
33770 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
33780 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
33790 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
337a0 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
337b0 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
337d0 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
337e0 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
337f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
33800 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
33810 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
33820 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
33830 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
33840 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
33850 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
33860 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
33870 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
33880 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
33890 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
338a0 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
338b0 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
338c0 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
338d0 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
338e0 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
338f0 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
33900 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  ectly..  */.#if 
33910 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
33920 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
33930 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
33940 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
33950 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
33960 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
33970 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70  der=(int)(info.p
33980 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29  Payload - pCell)
33990 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
339a0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
339b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
339c0 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
339d0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
339e0 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
339f0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
33a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
33a10 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  or == &pCell[inf
33a20 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a  o.iOverflow] );.
33a30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
33a40 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
33a50 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
33a60 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
33a70 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
33a80 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
33a90 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
33aa0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
33ab0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
33ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
33ad0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
33ae0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
33af0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
33b00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
33b10 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
33b20 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
33b30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
33b40 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
33b50 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
33b60 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
33b70 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
33b80 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
33b90 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
33ba0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
33bb0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
33bc0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
33bd0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33be0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
33bf0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
33c00 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
33c10 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
33c20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33c30 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33c40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
33c50 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
33c60 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
33c70 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
33c80 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
33c90 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
33ca0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
33cb0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
33cc0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
33cd0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
33ce0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
33cf0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
33d00 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
33d10 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
33d20 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
33d30 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
33d40 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
33d50 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
33d60 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
33d70 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
33d80 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
33d90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
33da0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
33db0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
33dc0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
33dd0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
33de0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
33df0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
33e00 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
33e10 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
33e20 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
33e30 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
33e40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33e50 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
33e60 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
33e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33e80 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
33e90 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
33ea0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
33eb0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
33ec0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
33ed0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
33ee0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
33ef0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
33f00 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
33f10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
33f20 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
33f30 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
33f40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
33f50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
33f60 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
33f70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
33f80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
33f90 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
33fa0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
33fb0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
33fc0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
33fd0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
33fe0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
33ff0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
34000 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
34010 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
34020 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34030 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34040 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34050 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34060 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
34070 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
34080 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34090 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
340a0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
340b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
340c0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
340d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
340e0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
340f0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
34100 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34110 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34120 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34130 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34140 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34150 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
34160 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
34170 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
34180 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
34190 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
341a0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
341b0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
341c0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
341d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
341e0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
341f0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
34200 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
34210 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
34220 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34230 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
34240 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
34250 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
34260 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
34270 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
34280 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
34290 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
342a0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
342b0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
342c0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
342d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
342e0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
342f0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
34300 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34310 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34320 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34330 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34340 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34350 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
34360 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34370 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34380 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
34390 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
343a0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
343b0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
343c0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
343d0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
343e0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
343f0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34400 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34410 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34420 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34430 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34440 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
34450 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
34460 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
34470 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
34480 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
34490 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
344a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
344b0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
344c0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
344d0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
344e0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
344f0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
34500 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
34510 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
34520 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
34530 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
34540 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
34550 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
34560 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
34570 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
34580 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
34590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
345a0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
345b0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
345c0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
345d0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
345e0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
345f0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
34600 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
34610 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
34620 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
34630 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
34640 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
34650 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
34660 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
34670 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
34680 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
34690 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
346a0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
346b0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
346c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
346d0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
346e0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
346f0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
34700 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
34710 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
34720 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
34730 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
34740 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
34750 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
34760 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
34770 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
34780 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
34790 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
347a0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
347b0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
347c0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
347d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
347e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
347f0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
34800 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
34810 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
34820 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
34830 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
34840 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
34850 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
34860 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
34870 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
34880 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
34890 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
348a0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
348b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
348c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
348d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
348e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
348f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
34900 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
34910 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
34920 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
34930 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
34940 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
34950 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
34960 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
34970 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
34980 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
34990 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
349a0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
349b0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
349c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
349d0 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c  ze );.  if( pc <
349e0 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26   (u32)get2byte(&
349f0 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20  data[hdr+5]) || 
34a00 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  pc+sz > pPage->p
34a10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
34a20 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
34a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
34a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
34a50 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61  }.  rc = freeSpa
34a60 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a  ce(pPage, pc, sz
34a70 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
34a80 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
34a90 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
34aa0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
34ab0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
34ac0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ll==0 ){.    mem
34ad0 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
34ae0 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74  , 0, 4);.    dat
34af0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
34b00 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
34b10 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+5], pPage->
34b20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
34b30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
34b40 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ee = pPage->pBt-
34b50 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50  >usableSize - pP
34b60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20  age->hdrOffset. 
34b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b80 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63        - pPage->c
34b90 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b  hildPtrSize - 8;
34ba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
34bb0 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
34bc0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
34bd0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70  l - idx));.    p
34be0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
34bf0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
34c00 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ll);.    pPage->
34c10 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a  nFree += 2;.  }.
34c20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
34c30 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
34c40 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
34c50 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
34c60 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
34c70 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
34c80 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
34c90 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
34ca0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
34cb0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
34cc0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
34cd0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
34ce0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
34cf0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
34d00 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
34d10 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
34d20 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
34d30 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
34d40 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
34d50 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
34d60 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
34d70 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
34d80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
34d90 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
34da0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
34db0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
34dc0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
34dd0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
34de0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
34df0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
34e00 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
34e10 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
34e20 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
34e30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
34e40 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  id insertCell(. 
34e50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
34e60 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
34e70 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
34e80 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
34e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
34ea0 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
34eb0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
34ec0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
34ed0 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
34ee0 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
34ef0 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
34f00 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
34f10 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
34f20 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
34f30 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
34f40 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
34f50 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
34f60 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
34f70 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
34f80 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld,      /* If n
34f90 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
34fa0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
34fb0 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
34fc0 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20  /.  int *pRC    
34fd0 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e        /* Read an
34fe0 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63  d write return c
34ff0 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f  ode from here */
35000 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20  .){.  int idx = 
35010 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  0;      /* Where
35020 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
35030 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
35040 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
35050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35060 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
35070 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
35080 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
35090 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
350a0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e  age */.  u8 *pIn
350b0 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s;         /* Th
350c0 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65  e point in pPage
350d0 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65  ->aCellIdx[] whe
350e0 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72  re no cell inser
350f0 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ted */..  if( *p
35100 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
35110 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
35120 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
35130 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58   );.  assert( MX
35150 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
35160 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
35170 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
35180 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
35190 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55  e->pBt) || CORRU
351a0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
351b0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
351c0 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
351d0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
351e0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
351f0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
35200 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
35210 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
35220 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35230 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35240 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35250 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
35260 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
35270 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
35280 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
35290 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
352a0 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
352b0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
352c0 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
352d0 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
352e0 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
352f0 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
35300 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
35310 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
35320 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
35330 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
35340 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
35350 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
35360 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
35370 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
35380 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
35390 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
353a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
353b0 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
353c0 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d  sert( sz==pPage-
353d0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
353e0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
353f0 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
35400 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
35410 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
35420 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
35430 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
35440 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
35450 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a  pTemp, pCell, sz
35460 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
35470 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
35480 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
35490 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
354a0 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
354b0 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
354c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
354d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28  .    assert( j<(
354e0 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67  int)(sizeof(pPag
354f0 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f  e->apOvfl)/sizeo
35500 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  f(pPage->apOvfl[
35510 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
35520 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70  e->apOvfl[j] = p
35530 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
35540 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31  >aiOvfl[j] = (u1
35550 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  6)i;..    /* Whe
35560 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
35570 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79  lows occur, they
35580 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71 75   are always sequ
35590 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20  ential and in.  
355a0 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65    ** sorted orde
355b0 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69 61  r.  This invaria
355c0 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75 73  nts arise becaus
355d0 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  e multiple overf
355e0 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20  lows can.    ** 
355f0 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20  only occur when 
35600 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64 65  inserting divide
35610 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  r cells into the
35620 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75 72   parent page dur
35630 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e  ing.    ** balan
35640 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69  cing, and the di
35650 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61 63  viders are adjac
35660 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a  ent and sorted..
35670 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
35680 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65  t( j==0 || pPage
35690 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75  ->aiOvfl[j-1]<(u
356a0 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66  16)i ); /* Overf
356b0 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f  lows in sorted o
356c0 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65  rder */.    asse
356d0 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70  rt( j==0 || i==p
356e0 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
356f0 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72  ]+1 );   /* Over
35700 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e  flows are sequen
35710 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  tial */.  }else{
35720 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
35730 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
35740 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
35750 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
35760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35770 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
35780 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
35790 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
357a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
357b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
357c0 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
357d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
357e0 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74 61     assert( &data
357f0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
35800 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c  et]==pPage->aCel
35810 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d  lIdx );.    rc =
35820 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
35830 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b  Page, sz, &idx);
35840 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a  .    if( rc ){ *
35850 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e  pRC = rc; return
35860 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ; }.    /* The a
35870 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72  llocateSpace() r
35880 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65  outine guarantee
35890 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
358a0 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a  properties.    *
358b0 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  * if it returns 
358c0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a  successfully */.
358d0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
358e0 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
358f0 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65  rt( idx >= pPage
35900 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
35910 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c  Page->nCell+2 ||
35920 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
35930 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
35940 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
35950 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35960 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
35970 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20  Free -= (u16)(2 
35980 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70  + sz);.    memcp
35990 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43  y(&data[idx], pC
359a0 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66  ell, sz);.    if
359b0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
359c0 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
359d0 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
359e0 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d      }.    pIns =
359f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
35a00 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d   + i*2;.    memm
35a10 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73  ove(pIns+2, pIns
35a20 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
35a30 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74  l - i));.    put
35a40 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29  2byte(pIns, idx)
35a50 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
35a60 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63  ll++;.    /* inc
35a70 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20  rement the cell 
35a80 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28  count */.    if(
35a90 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e   (++data[pPage->
35aa0 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30  hdrOffset+4])==0
35ab0 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68   ) data[pPage->h
35ac0 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20  drOffset+3]++;. 
35ad0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62     assert( get2b
35ae0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
35af0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
35b00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
35b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
35b30 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
35b40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
35b50 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
35b60 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
35b70 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
35b80 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
35b90 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
35ba0 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
35bb0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
35bc0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
35bd0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
35be0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
35bf0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
35c00 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
35c10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
35c20 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72  ../*.** A CellAr
35c30 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  ray object conta
35c40 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20 70  ins a cache of p
35c50 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65  ointers and size
35c60 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65  s for a.** conse
35c70 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65 20  cutive sequence 
35c80 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69  of cells that mi
35c90 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c 74  ght be held mult
35ca0 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74  iple pages..*/.t
35cb0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65  ypedef struct Ce
35cc0 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61  llArray CellArra
35cd0 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72  y;.struct CellAr
35ce0 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c  ray {.  int nCel
35cf0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
35d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
35d10 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
35d20 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65  /.  MemPage *pRe
35d30 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  f;          /* R
35d40 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f  eference page */
35d50 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
35d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
35d70 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
35d80 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
35d90 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
35da0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
35db0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
35dc0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b  n apCell[] */.};
35dd0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
35de0 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 73  e the cell sizes
35df0 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c 20   at idx, idx+1, 
35e00 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76  ..., idx+N-1 hav
35e10 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74  e been.** comput
35e20 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
35e30 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43  id populateCellC
35e40 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  ache(CellArray *
35e50 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  p, int idx, int 
35e60 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  N){.  assert( id
35e70 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70  x>=0 && idx+N<=p
35e80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69  ->nCell );.  whi
35e90 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61  le( N>0 ){.    a
35ea0 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c  ssert( p->apCell
35eb0 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20  [idx]!=0 );.    
35ec0 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64  if( p->szCell[id
35ed0 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  x]==0 ){.      p
35ee0 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20  ->szCell[idx] = 
35ef0 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
35f00 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
35f10 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20  pCell[idx]);.   
35f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
35f30 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
35f40 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
35f50 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d    p->szCell[idx]
35f60 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  ==p->pRef->xCell
35f70 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
35f80 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b  >apCell[idx]) );
35f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b  .    }.    idx++
35fa0 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d  ;.    N--;.  }.}
35fb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
35fc0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 4e  he size of the N
35fd0 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  th element of th
35fe0 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a  e cell array.*/.
35ff0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
36000 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70 75  INLINE u16 compu
36010 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41  teCellSize(CellA
36020 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b  rray *p, int N){
36030 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20  .  assert( N>=0 
36040 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b  && N<p->nCell );
36050 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 7a  .  assert( p->sz
36060 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20  Cell[N]==0 );.  
36070 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70  p->szCell[N] = p
36080 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36090 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
360a0 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75  Cell[N]);.  retu
360b0 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
360c0 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 61  .}.static u16 ca
360d0 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c  chedCellSize(Cel
360e0 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
360f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
36100 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
36110 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  );.  if( p->szCe
36120 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20 70  ll[N] ) return p
36130 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72  ->szCell[N];.  r
36140 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c  eturn computeCel
36150 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a  lSize(p, N);.}..
36160 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
36170 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f  ll[] contains po
36180 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20  inters to nCell 
36190 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c 6c  b-tree page cell
361a0 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c  s. The .** szCel
361b0 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  l[] array contai
361c0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
361d0 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65 6c  ytes of each cel
361e0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
361f0 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68 65  .** replaces the
36200 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
36210 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77 69  s of page pPg wi
36220 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
36230 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61  of the cell.** a
36240 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  rray..**.** Some
36250 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69 6e   of the cells in
36260 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75   apCell[] may cu
36270 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72 65  rrently be store
36280 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a  d in pPg. This.*
36290 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  * function works
362a0 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
362b0 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73 20   caused by this 
362c0 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  by making a copy
362d0 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68   of any .** such
362e0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76   cells before ov
362f0 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70 61  erwriting the pa
36300 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  ge data..**.** T
36310 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65  he MemPage.nFree
36320 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69   field is invali
36330 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  dated by this fu
36340 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74 68  nction. It is th
36350 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
36360 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
36370 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f 72  er to set it cor
36380 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
36390 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61 67  c int rebuildPag
363a0 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
363b0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
363c0 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
363d0 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
363e0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
363f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
36400 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  inal number of c
36410 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  ells on page */.
36420 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
36430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36440 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
36450 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
36460 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
36470 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
36480 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
36490 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  */.){.  const in
364a0 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72  t hdr = pPg->hdr
364b0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
364c0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
364d0 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ader on pPg */. 
364e0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
364f0 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 20  a = pPg->aData; 
36500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
36510 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
36520 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   pPg */.  const 
36530 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
36540 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
36550 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f  eSize;.  u8 * co
36560 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
36570 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  a[usableSize];. 
36580 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 43   int i;.  u8 *pC
36590 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61 43  ellptr = pPg->aC
365a0 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70 54  ellIdx;.  u8 *pT
365b0 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
365c0 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d 3e  rTempSpace(pPg->
365d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
365e0 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20  u8 *pData;..  i 
365f0 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
36600 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
36610 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61  cpy(&pTmp[i], &a
36620 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53  Data[i], usableS
36630 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61  ize - i);..  pDa
36640 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72  ta = pEnd;.  for
36650 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
36660 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
36670 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a  ll = apCell[i];.
36680 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 61 44      if( pCell>aD
36690 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e  ata && pCell<pEn
366a0 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  d ){.      pCell
366b0 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d   = &pTmp[pCell -
366c0 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20   aData];.    }. 
366d0 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65     pData -= szCe
366e0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ll[i];.    put2b
366f0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
36700 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a  Data - aData));.
36710 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
36720 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  2;.    if( pData
36730 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65   < pCellptr ) re
36740 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
36750 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65  UPT_BKPT;.    me
36760 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c  mcpy(pData, pCel
36770 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20  l, szCell[i]);. 
36780 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c     assert( szCel
36790 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]==pPg->xCell
367a0 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29  Size(pPg, pCell)
367b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
367c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
367d0 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e  szCell[i]!=pPg->
367e0 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43  xCellSize(pPg,pC
367f0 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ell) );.  }..  /
36800 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
36810 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65   field is now se
36820 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54  t incorrectly. T
36830 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66  he caller will f
36840 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d  ix it. */.  pPg-
36850 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
36860 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77    pPg->nOverflow
36870 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74   = 0;..  put2byt
36880 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c  e(&aData[hdr+1],
36890 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28   0);.  put2byte(
368a0 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  &aData[hdr+3], p
368b0 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  Pg->nCell);.  pu
368c0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
368d0 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44  r+5], pData - aD
368e0 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64  ata);.  aData[hd
368f0 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72  r+7] = 0x00;.  r
36900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
36920 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
36930 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
36940 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
36950 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a  . Array szCell.*
36960 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  * contains the s
36970 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
36980 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20  each such cell. 
36990 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
369a0 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64  tempts to .** ad
369b0 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72  d the cells stor
369c0 65 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ed in the array 
369d0 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  to page pPg. If 
369e0 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75  it cannot (becau
369f0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  se .** the page 
36a00 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72  needs to be defr
36a10 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20  agmented before 
36a20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  the cells will f
36a30 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  it), non-zero.**
36a40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
36a50 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
36a60 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20  cells are added 
36a70 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65  successfully, ze
36a80 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  ro is.** returne
36a90 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
36aa0 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74  t pCellptr point
36ab0 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  s to the first e
36ac0 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c  ntry in the cell
36ad0 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a  -pointer array.*
36ae0 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20  * (part of page 
36af0 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65  pPg) to populate
36b00 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43  . After cell apC
36b10 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65  ell[0] is writte
36b20 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65  n to the.** page
36b30 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20   body, a 16-bit 
36b40 6f 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65  offset is writte
36b50 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41  n to pCellptr. A
36b60 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61  nd so on, for ea
36b70 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68  ch.** cell in th
36b80 65 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74  e array. It is t
36b90 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
36ba0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36bb0 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
36bc0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
36bd0 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70  overwrite this p
36be0 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
36bf0 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a  pointer array..*
36c00 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
36c10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36c20 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74  d, *ppData point
36c30 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
36c40 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  f the .** conten
36c50 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70  t area on page p
36c60 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20  Pg. If the size 
36c70 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
36c80 72 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c  rea is extended,
36c90 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75  .** *ppData is u
36ca0 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20  pdated to point 
36cb0 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74  to the new start
36cc0 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
36cd0 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72  area.** before r
36ce0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
36cf0 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e  Finally, argumen
36d00 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20  t pBegin points 
36d10 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65  to the byte imme
36d20 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
36d30 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  g the.** end of 
36d40 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
36d50 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20  ed by this page 
36d60 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69  for the cell-poi
36d70 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a  nter area (for.*
36d80 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f  * all cells - no
36d90 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73  t just those ins
36da0 65 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72  erted by the cur
36db0 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74  rent call). If t
36dc0 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72  he content.** ar
36dd0 65 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e  ea must be exten
36de0 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68  ded to before th
36df0 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
36e00 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  r to accomodate 
36e10 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20  all.** cells in 
36e20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74  apCell[], then t
36e30 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20  he cells do not 
36e40 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  fit and non-zero
36e50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
36e60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36e70 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d  InsertArray(.  M
36e80 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36ea0 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65  * Page to add ce
36eb0 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a  lls to */.  u8 *
36ec0 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20  pBegin,         
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
36ee0 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74  nd of cell-point
36ef0 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38  er array */.  u8
36f00 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20   **ppData,      
36f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f20 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f   IN/OUT: Page co
36f30 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e  ntent -area poin
36f40 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
36f50 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20  llptr,          
36f60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
36f70 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e  ter to cell-poin
36f80 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ter area */.  in
36f90 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
36fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36fb0 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
36fc0 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20  cell to add */. 
36fd0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ff0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
37000 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50  lls to add to pP
37010 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  g */.  CellArray
37020 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
37030 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37040 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  of cells */.){. 
37050 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44   int i;.  u8 *aD
37060 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
37070 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20  ;.  u8 *pData = 
37080 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  *ppData;.  int i
37090 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e  End = iFirst + n
370a0 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
370b0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50  CORRUPT_DB || pP
370c0 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  g->hdrOffset==0 
370d0 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63  );    /* Never c
370e0 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20  alled on page 1 
370f0 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  */.  for(i=iFirs
37100 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b  t; i<iEnd; i++){
37110 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b  .    int sz, rc;
37120 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a  .    u8 *pSlot;.
37130 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43      sz = cachedC
37140 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c  ellSize(pCArray,
37150 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44   i);.    if( (aD
37160 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61  ata[1]==0 && aDa
37170 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53  ta[2]==0) || (pS
37180 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  lot = pageFindSl
37190 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d  ot(pPg,sz,&rc))=
371a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  =0 ){.      pDat
371b0 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69  a -= sz;.      i
371c0 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
371d0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
371e0 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b    pSlot = pData;
371f0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
37200 79 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79  y(pSlot, pCArray
37210 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  ->apCell[i], sz)
37220 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37230 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20  Cellptr, (pSlot 
37240 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37250 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37260 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44  }.  *ppData = pD
37270 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ata;.  return 0;
37280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37290 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
372a0 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
372b0 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
372c0 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a  . Array szCell .
372d0 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
372e0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
372f0 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e   each such cell.
37300 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
37310 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  dds the.** space
37320 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
37330 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68   each cell in th
37340 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  e array that is 
37350 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
37360 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20   .** within the 
37370 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74  body of pPg to t
37380 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74  he pPg free-list
37390 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  . The cell-point
373a0 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a  ers and other.**
373b0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70   fields of the p
373c0 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61  age are not upda
373d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
373e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
373f0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
37400 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64  r of cells added
37410 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
37420 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
37430 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a   pageFreeArray(.
37440 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37460 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69    /* Page to edi
37470 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  t */.  int iFirs
37480 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
37490 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
374a0 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
374b0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
374c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374d0 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20      /* Cells to 
374e0 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c  delete */.  Cell
374f0 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20  Array *pCArray  
37500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
37510 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
37520 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
37530 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
37540 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
37550 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
37560 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
37570 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f  Size];.  u8 * co
37580 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44  nst pStart = &aD
37590 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73  ata[pPg->hdrOffs
375a0 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68  et + 8 + pPg->ch
375b0 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69  ildPtrSize];.  i
375c0 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69  nt nRet = 0;.  i
375d0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64  nt i;.  int iEnd
375e0 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
375f0 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  l;.  u8 *pFree =
37600 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
37610 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69   = 0;..  for(i=i
37620 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69  First; i<iEnd; i
37630 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
37640 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70  ll = pCArray->ap
37650 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
37660 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26   pCell>=pStart &
37670 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a  & pCell<pEnd ){.
37680 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
37690 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74      /* No need t
376a0 6f 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c  o use cachedCell
376b0 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68  Size() here.  Th
376c0 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  e sizes of all c
376d0 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20  ells that.      
376e0 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65  ** are to be fre
376f0 65 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ed have already 
37700 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77  been computing w
37710 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68  hile deciding wh
37720 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c  ich.      ** cel
37730 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20  ls need freeing 
37740 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43  */.      sz = pC
37750 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d  Array->szCell[i]
37760 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20  ;  assert( sz>0 
37770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
37780 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29  ee!=(pCell + sz)
37790 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
377a0 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  pFree ){.       
377b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
377c0 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
377d0 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
377e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
377f0 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36  eSpace(pPg, (u16
37800 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29  )(pFree - aData)
37810 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20  , szFree);.     
37820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72     }.        pFr
37830 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
37840 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b      szFree = sz;
37850 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
37860 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74  ee+sz>pEnd ) ret
37870 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
37880 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65  se{.        pFre
37890 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
378a0 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b     szFree += sz;
378b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
378c0 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Ret++;.    }.  }
378d0 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
378e0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
378f0 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
37900 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<65536
37910 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63   );.    freeSpac
37920 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72  e(pPg, (u16)(pFr
37930 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46  ee - aData), szF
37940 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
37950 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nRet;.}../*.*
37960 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  * apCell[] and s
37970 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  zCell[] contains
37980 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64   pointers to and
37990 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65   sizes of all ce
379a0 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  lls in the.** pa
379b0 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
379c0 65 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74  ed.  The current
379d0 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20   page, pPg, has 
379e0 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73  pPg->nCell cells
379f0 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74   starting.** wit
37a00 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20  h apCell[iOld]. 
37a10 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   After balancing
37a20 2c 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75  , this page shou
37a30 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c  ld hold nNew cel
37a40 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61  ls.** starting a
37a50 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a  t apCell[iNew]..
37a60 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37a70 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
37a80 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e  essary adjustmen
37a90 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61  ts to pPg so tha
37aa0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  t it contains.**
37ab0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c   the correct cel
37ac0 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62  ls after being b
37ad0 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  alanced..**.** T
37ae0 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69  he pPg->nFree fi
37af0 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77  eld is invalid w
37b00 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
37b10 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73  n returns. It is
37b20 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69   the.** responsi
37b30 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
37b40 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
37b50 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
37b60 74 69 63 20 69 6e 74 20 65 64 69 74 50 61 67 65  tic int editPage
37b70 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
37b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37b90 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
37ba0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
37bb0 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
37bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37bd0 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
37be0 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70  l currently on p
37bf0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  age */.  int iNe
37c00 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
37c10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37c20 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63  x of new first c
37c30 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  ell on page */. 
37c40 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20   int nNew,      
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c60 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
37c70 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
37c80 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  e */.  CellArray
37c90 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
37ca0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37cb0 6f 66 20 63 65 6c 6c 73 20 61 6e 64 20 73 69 7a  of cells and siz
37cc0 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  es */.){.  u8 * 
37cd0 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
37ce0 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73  g->aData;.  cons
37cf0 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
37d00 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
37d10 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d   *pBegin = &pPg-
37d20 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a  >aCellIdx[nNew *
37d30 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c   2];.  int nCell
37d40 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20   = pPg->nCell;  
37d50 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74       /* Cells st
37d60 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20  ored on pPg */. 
37d70 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38   u8 *pData;.  u8
37d80 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e   *pCellptr;.  in
37d90 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45  t i;.  int iOldE
37da0 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d  nd = iOld + pPg-
37db0 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f  >nCell + pPg->nO
37dc0 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69  verflow;.  int i
37dd0 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20  NewEnd = iNew + 
37de0 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51  nNew;..#ifdef SQ
37df0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
37e00 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50  *pTmp = sqlite3P
37e10 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50  agerTempSpace(pP
37e20 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  g->pBt->pPager);
37e30 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20  .  memcpy(pTmp, 
37e40 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d  aData, pPg->pBt-
37e50 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65  >usableSize);.#e
37e60 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ndif..  /* Remov
37e70 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  e cells from the
37e80 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20 6f   start and end o
37e90 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
37ea0 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20 29 7b  if( iOld<iNew ){
37eb0 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66 74 20  .    int nShift 
37ec0 3d 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  = pageFreeArray(
37ed0 70 50 67 2c 20 69 4f 6c 64 2c 20 69 4e 65 77 2d  pPg, iOld, iNew-
37ee0 69 4f 6c 64 2c 20 70 43 41 72 72 61 79 29 3b 0a  iOld, pCArray);.
37ef0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d      memmove(pPg-
37f00 3e 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d  >aCellIdx, &pPg-
37f10 3e 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74  >aCellIdx[nShift
37f20 2a 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20  *2], nCell*2);. 
37f30 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69     nCell -= nShi
37f40 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e  ft;.  }.  if( iN
37f50 65 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20  ewEnd < iOldEnd 
37f60 29 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20  ){.    nCell -= 
37f70 70 61 67 65 46 72 65 65 41 72 72 61 79 28 70 50  pageFreeArray(pP
37f80 67 2c 20 69 4e 65 77 45 6e 64 2c 20 69 4f 6c 64  g, iNewEnd, iOld
37f90 45 6e 64 20 2d 20 69 4e 65 77 45 6e 64 2c 20 70  End - iNewEnd, p
37fa0 43 41 72 72 61 79 29 3b 0a 20 20 7d 0a 0a 20 20  CArray);.  }..  
37fb0 70 44 61 74 61 20 3d 20 26 61 44 61 74 61 5b 67  pData = &aData[g
37fc0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
37fd0 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a  aData[hdr+5])];.
37fe0 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67    if( pData<pBeg
37ff0 69 6e 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61  in ) goto editpa
38000 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41  ge_fail;..  /* A
38010 64 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20  dd cells to the 
38020 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67  start of the pag
38030 65 20 2a 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c  e */.  if( iNew<
38040 69 4f 6c 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  iOld ){.    int 
38050 6e 41 64 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c  nAdd = MIN(nNew,
38060 69 4f 6c 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20  iOld-iNew);.    
38070 61 73 73 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e  assert( (iOld-iN
38080 65 77 29 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c  ew)<nNew || nCel
38090 6c 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  l==0 || CORRUPT_
380a0 44 42 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  DB );.    pCellp
380b0 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
380c0 64 78 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  dx;.    memmove(
380d0 26 70 43 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32  &pCellptr[nAdd*2
380e0 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65  ], pCellptr, nCe
380f0 6c 6c 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 70  ll*2);.    if( p
38100 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a  ageInsertArray(.
38110 20 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70            pPg, p
38120 42 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70  Begin, &pData, p
38130 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20  Cellptr,.       
38140 20 20 20 69 4e 65 77 2c 20 6e 41 64 64 2c 20 70     iNew, nAdd, p
38150 43 41 72 72 61 79 0a 20 20 20 20 29 20 29 20 67  CArray.    ) ) g
38160 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69  oto editpage_fai
38170 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20  l;.    nCell += 
38180 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nAdd;.  }..  /* 
38190 41 64 64 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  Add any overflow
381a0 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 66 6f 72 28   cells */.  for(
381b0 69 3d 30 3b 20 69 3c 70 50 67 2d 3e 6e 4f 76 65  i=0; i<pPg->nOve
381c0 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  rflow; i++){.   
381d0 20 69 6e 74 20 69 43 65 6c 6c 20 3d 20 28 69 4f   int iCell = (iO
381e0 6c 64 20 2b 20 70 50 67 2d 3e 61 69 4f 76 66 6c  ld + pPg->aiOvfl
381f0 5b 69 5d 29 20 2d 20 69 4e 65 77 3b 0a 20 20 20  [i]) - iNew;.   
38200 20 69 66 28 20 69 43 65 6c 6c 3e 3d 30 20 26 26   if( iCell>=0 &&
38210 20 69 43 65 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20   iCell<nNew ){. 
38220 20 20 20 20 20 70 43 65 6c 6c 70 74 72 20 3d 20       pCellptr = 
38230 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69  &pPg->aCellIdx[i
38240 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20 20 20 20 20  Cell * 2];.     
38250 20 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70   memmove(&pCellp
38260 74 72 5b 32 5d 2c 20 70 43 65 6c 6c 70 74 72 2c  tr[2], pCellptr,
38270 20 28 6e 43 65 6c 6c 20 2d 20 69 43 65 6c 6c 29   (nCell - iCell)
38280 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 6e 43 65   * 2);.      nCe
38290 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ll++;.      if( 
382a0 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
382b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67  .            pPg
382c0 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74 61  , pBegin, &pData
382d0 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20 20  , pCellptr,.    
382e0 20 20 20 20 20 20 20 20 69 43 65 6c 6c 2b 69 4e          iCell+iN
382f0 65 77 2c 20 31 2c 20 70 43 41 72 72 61 79 0a 20  ew, 1, pCArray. 
38300 20 20 20 20 20 29 20 29 20 67 6f 74 6f 20 65 64       ) ) goto ed
38310 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20  itpage_fail;.   
38320 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70   }.  }..  /* App
38330 65 6e 64 20 63 65 6c 6c 73 20 74 6f 20 74 68 65  end cells to the
38340 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
38350 20 2a 2f 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d   */.  pCellptr =
38360 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b   &pPg->aCellIdx[
38370 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28 20  nCell*2];.  if( 
38380 70 61 67 65 49 6e 73 65 72 74 41 72 72 61 79 28  pageInsertArray(
38390 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42  .        pPg, pB
383a0 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
383b0 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
383c0 69 4e 65 77 2b 6e 43 65 6c 6c 2c 20 6e 4e 65 77  iNew+nCell, nNew
383d0 2d 6e 43 65 6c 6c 2c 20 70 43 41 72 72 61 79 0a  -nCell, pCArray.
383e0 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
383f0 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70 50 67  age_fail;..  pPg
38400 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77 3b 0a  ->nCell = nNew;.
38410 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77    pPg->nOverflow
38420 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74   = 0;..  put2byt
38430 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
38440 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
38450 70 75 74 32 62