/ Hex Artifact Content
Login

Artifact a559d64185c737daf64f361df40a51f35e1f9ba862ae3f4193bf5eadc549e6b2:


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 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  it)).  ){.    re
1520: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1530: 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20  * If the client 
1540: 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72 20 77  is reading  or w
1550: 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  riting an index 
1560: 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61 20 69  and the schema i
1570: 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65  s.  ** not loade
1580: 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 6f  d, then it is to
1590: 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 61  o difficult to a
15a0: 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f  ctually check to
15b0: 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74 68 65   see if.  ** the
15c0: 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73 20 61   correct locks a
15d0: 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20  re held.  So do 
15e0: 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a 75 73  not bother - jus
15f0: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 0a 20  t return true.. 
1600: 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20 64 6f   ** This case do
1610: 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76  es not come up v
1620: 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77  ery often anyhow
1630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  ..  */.  if( isI
1640: 6e 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d  ndex && (!pSchem
1650: 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73  a || (pSchema->s
1660: 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f 53 63  chemaFlags&DB_Sc
1670: 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20  hemaLoaded)==0) 
1680: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
16a0: 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74 2d 70  e out the root-p
16b0: 61 67 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63  age that the loc
16c0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  k should be held
16d0: 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20   on. For table. 
16e0: 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74 68 69   ** b-trees, thi
16f0: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 72 6f  s is just the ro
1700: 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1710: 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65 61 64  -tree being read
1720: 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e   or.  ** written
1730: 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d 74 72  . For index b-tr
1740: 65 65 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ees, it is the r
1750: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1760: 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1770: 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28  table.  */.  if(
1780: 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20 20 20   isIndex ){.    
1790: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
17a0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
17b0: 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d  hFirst(&pSchema-
17c0: 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20 70 3d  >idxHash); p; p=
17d0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
17e0: 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  )){.      Index 
17f0: 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78 20 2a  *pIdx = (Index *
1800: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1810: 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  p);.      if( pI
1820: 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69  dx->tnum==(int)i
1830: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
1840: 69 66 28 20 69 54 61 62 20 29 7b 0a 20 20 20 20  if( iTab ){.    
1850: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
1860: 6d 6f 72 65 20 69 6e 64 65 78 65 73 20 73 68 61  more indexes sha
1870: 72 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  re the same root
1880: 20 70 61 67 65 2e 20 20 54 68 65 72 65 20 6d 75   page.  There mu
1890: 73 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  st.          ** 
18a0: 62 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  be imposter tabl
18b0: 65 73 2e 20 20 53 6f 20 6a 75 73 74 20 72 65 74  es.  So just ret
18c0: 75 72 6e 20 74 72 75 65 2e 20 20 54 68 65 20 61  urn true.  The a
18d0: 73 73 65 72 74 20 69 73 20 6e 6f 74 0a 20 20 20  ssert is not.   
18e0: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 66 75 6c         ** useful
18f0: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 20 2a   in that case. *
1900: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  /.          retu
1910: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
1920: 20 20 20 20 20 20 20 20 69 54 61 62 20 3d 20 70          iTab = p
1930: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75  Idx->pTable->tnu
1940: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54  .  }else{.    iT
1960: 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a  ab = iRoot;.  }.
1970: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
1980: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1990: 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77 72 69  ck. Either a wri
19a0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d  te-lock on root-
19b0: 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a 20 20  page iTab, a .  
19c0: 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  ** write-lock on
19d0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
19e0: 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20 63 6c  e, or (if the cl
19f0: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 29  ient is reading)
1a00: 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63   a.  ** read-loc
1a10: 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c 20 73  k on iTab will s
1a20: 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e 20 31  uffice. Return 1
1a30: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 73 65   if any of these
1a40: 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a   are found.  */.
1a50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72    for(pLock=pBtr
1a60: 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ee->pBt->pLock; 
1a70: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
1a80: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
1a90: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
1aa0: 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20 20 20  e==pBtree .     
1ab0: 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  && (pLock->iTabl
1ac0: 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63  e==iTab || (pLoc
1ad0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  k->eLock==WRITE_
1ae0: 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69  LOCK && pLock->i
1af0: 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20  Table==1)).     
1b00: 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e  && pLock->eLock>
1b10: 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20 20 20  =eLockType .    
1b20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b30: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
1b40: 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66 69 6e  /* Failed to fin
1b50: 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c  d the required l
1b60: 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ock. */.  return
1b70: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
1b80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1b90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ba0: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
1bb0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
1bc0: 65 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  e used as part o
1bd0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
1be0: 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a  ments only. ****
1bf0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1c00: 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64 20 62  ue if it would b
1c10: 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  e illegal for pB
1c20: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 6e  tree to write in
1c30: 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  to the.** table 
1c40: 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  or index rooted 
1c50: 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75 73 65  at iRoot because
1c60: 20 6f 74 68 65 72 20 73 68 61 72 65 64 20 63 6f   other shared co
1c70: 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a  nnections are.**
1c80: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20   simultaneously 
1c90: 72 65 61 64 69 6e 67 20 74 68 61 74 20 73 61 6d  reading that sam
1ca0: 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1cb0: 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ..**.** It is il
1cc0: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1cd0: 20 74 6f 20 77 72 69 74 65 20 69 66 20 73 6f 6d   to write if som
1ce0: 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  e other Btree ob
1cf0: 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73 68 61  ject that.** sha
1d00: 72 65 73 20 74 68 65 20 73 61 6d 65 20 42 74 53  res the same BtS
1d10: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69 73 20  hared object is 
1d20: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1d30: 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20  g or writing.** 
1d40: 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e  the iRoot table.
1d50: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
1d60: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
1d70: 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a 20 72  ect has the.** r
1d80: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
1d90: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 69  flag set, then i
1da0: 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20  t is OK for the 
1db0: 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a  other object to.
1dc0: 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64 20 63  ** have a read c
1dd0: 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ursor..**.** For
1de0: 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65   example, before
1df0: 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
1e00: 70 61 72 74 20 6f 66 20 74 68 65 20 74 61 62 6c  part of the tabl
1e10: 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f  e or index.** ro
1e20: 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52 6f  oted at page iRo
1e30: 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63  ot, one should c
1e40: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73  all:.**.**    as
1e50: 73 65 72 74 28 20 21 68 61 73 52 65 61 64 43 6f  sert( !hasReadCo
1e60: 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65 2c 20  nflicts(pBtree, 
1e70: 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61  iRoot) );.*/.sta
1e80: 74 69 63 20 69 6e 74 20 68 61 73 52 65 61 64 43  tic int hasReadC
1e90: 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65 20 2a  onflicts(Btree *
1ea0: 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f  pBtree, Pgno iRo
1eb0: 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ot){.  BtCursor 
1ec0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  *p;.  for(p=pBtr
1ed0: 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1ee0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1f00: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20  oRoot==iRoot .  
1f10: 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65 65 21     && p->pBtree!
1f20: 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26 26 20  =pBtree.     && 
1f30: 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  0==(p->pBtree->d
1f40: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1f50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a  E_ReadUncommit).
1f60: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1f70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1f80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1f90: 65 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64  endif    /* #ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1fb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  */../*.** Query 
1fc0: 74 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20  to see if Btree 
1fd0: 68 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74  handle p may obt
1fe0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79  ain a lock of ty
1ff0: 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45  pe eLock .** (RE
2000: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
2010: 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61  _LOCK) on the ta
2020: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2030: 67 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a  ge iTab. Return.
2040: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ** SQLITE_OK if 
2050: 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20  the lock may be 
2060: 6f 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c  obtained (by cal
2070: 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65  ling.** setShare
2080: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2090: 29 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f  )), or SQLITE_LO
20a0: 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  CKED if not..*/.
20b0: 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79  static int query
20c0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
20d0: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
20e0: 67 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f  gno iTab, u8 eLo
20f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2100: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2110: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2120: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2130: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2140: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2150: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2160: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2170: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2180: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2190: 0a 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e  .  assert( !(p->
21a0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
21b0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c  _ReadUncommit)||
21c0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
21d0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
21e0: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
21f0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2200: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2210: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2220: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2230: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2240: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2250: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2260: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2270: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
2280: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
2290: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
22a0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
22b0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
22c0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
22d0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
22e0: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
22f0: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2300: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2310: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2320: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2330: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2340: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2350: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2360: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2370: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
2380: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
2390: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
23a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
23c0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
23d0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
23e0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
23f0: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2400: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2410: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2420: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2430: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2440: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2450: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2470: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2480: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2490: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
24a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
24b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
24c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
24d0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
24e0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
24f0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2500: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2510: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2520: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2530: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2540: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2550: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2560: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2570: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2580: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
25b0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
25c0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
25d0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
25e0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
25f0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2600: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2610: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2620: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2630: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2640: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2650: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2660: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2670: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2680: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2690: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
26a0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
26b0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
26c0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
26d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
26e0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
26f0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2700: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2710: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2720: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2730: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2750: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2760: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2770: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2780: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2790: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
27a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
27b0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
27c0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
27d0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
27e0: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
27f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2800: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2810: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2830: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2840: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2850: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2860: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2870: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
2880: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
2890: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
28a0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
28b0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
28c0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
28d0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
28e0: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
28f0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2900: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2910: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2920: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2930: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2940: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2950: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2960: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2970: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
2980: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
2990: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
29a0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
29b0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
29c0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
29d0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
29e0: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
29f0: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2a00: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2a10: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2a20: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2a30: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2a40: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2a50: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2a60: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2a70: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
2a80: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
2a90: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2aa0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
2ab0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
2ac0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
2ad0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2ae0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2af0: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2b10: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2b20: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2b30: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2b40: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2b50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2b60: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2b70: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2b80: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2b90: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ba0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2bb0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2bc0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2bd0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2bf0: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2c00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2c10: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2c20: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2c30: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2c40: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2c50: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2c60: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2c70: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2c80: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2c90: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2ca0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2cb0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2cc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2cd0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2ce0: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2cf0: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2d00: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2d10: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2d20: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2d30: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20  E_ReadUncommit) 
2d40: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2d50: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
2d60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
2d70: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
2d80: 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65 20  d on a sharable 
2d90: 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74 20  b-tree after it 
2da0: 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 64  .  ** has been d
2db0: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
2dc0: 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20 68  o other b-tree h
2dd0: 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74 69  olds a conflicti
2de0: 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  ng lock.  */.  a
2df0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
2e00: 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
2e20: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2e30: 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
2e40: 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20  eLock) );..  /* 
2e50: 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65  First search the
2e60: 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69   list for an exi
2e70: 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68  sting lock on th
2e80: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
2e90: 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
2ea0: 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
2eb0: 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
2ec0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2ed0: 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26  iTable==iTable &
2ee0: 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d  & pIter->pBtree=
2ef0: 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63  =p ){.      pLoc
2f00: 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20  k = pIter;.     
2f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f20: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
2f30: 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20  bove search did 
2f40: 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63  not find a BtLoc
2f50: 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61  k struct associa
2f60: 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a  ting Btree p.  *
2f70: 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61  * with table iTa
2f80: 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e  ble, allocate on
2f90: 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e  e and link it in
2fa0: 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a  to the list..  *
2fb0: 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29  /.  if( !pLock )
2fc0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42  {.    pLock = (B
2fd0: 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d  tLock *)sqlite3M
2fe0: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
2ff0: 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69  (BtLock));.    i
3000: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
3010: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3020: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
3030: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
3040: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
3050: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
3060: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
3070: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
3080: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
3090: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
30a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
30b0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
30c0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
30d0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
30e0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
30f0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3100: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
3110: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
3120: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
3130: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
3140: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
3150: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
3160: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
3170: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
3180: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
3190: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
31a0: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
31b0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
31c0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
31d0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
31e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
3210: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
3220: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
3230: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
3240: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
3250: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
3260: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
3270: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
3280: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
3290: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
32a0: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
32b0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
32c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
32d0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
32e0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
32f0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
3300: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3310: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3320: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3330: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3340: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3350: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3360: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3370: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3380: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3390: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
33a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
33b0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
33c0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
33d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33e0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
33f0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
3400: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3410: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3420: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3430: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3440: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3450: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3460: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3470: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3480: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3490: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
34a0: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
34b0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
34c0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
34d0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
34e0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
34f0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
3500: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3510: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3520: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3530: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3540: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3550: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3560: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3570: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3580: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3590: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
35a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35b0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
35c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
35d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
35e0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35f0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
3600: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3610: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3620: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3630: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3640: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3650: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3660: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3670: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3680: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3690: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
36a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36b0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
36c0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
36d0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
36e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
36f0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
3700: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3710: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3720: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3730: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3740: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3760: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3770: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3780: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3790: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
37a0: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
37b0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
37c0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
37d0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
37e0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
37f0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
3800: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3810: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3820: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3830: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3840: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3850: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3860: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3870: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3880: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3890: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
38a0: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
38b0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
38c0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
38d0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
38e0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
38f0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3900: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3910: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3920: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3930: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3940: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3950: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3960: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3980: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3990: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
39a0: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
39b0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
39c0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
39d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
39e0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
39f0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3a00: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3a10: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3a20: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3a30: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3a40: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3a50: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3a60: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3a70: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3a80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 77           /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3ac0: 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50  easePageOne(MemP
3ad0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20 20  age *pPage);    
3ae0: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3af0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
3b00: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
3b10: 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
3b20: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3b30: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3b40: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3b50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3b60: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3b70: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
3b80: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
3b90: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
3ba0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
3bb0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
3bc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3bd0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3be0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3bf0: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3c00: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3c10: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3c20: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56  >mutex);.}../* V
3c30: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
3c40: 75 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74  ursor and the Bt
3c50: 53 68 61 72 65 64 20 61 67 72 65 65 20 61 62 6f  Shared agree abo
3c60: 75 74 20 77 68 61 74 20 69 73 20 74 68 65 20 63  ut what is the c
3c70: 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61  urrent.** databa
3c80: 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68  se connetion. Th
3c90: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
3ca0: 69 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  in shared-cache 
3cb0: 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61 74  mode. If the dat
3cc0: 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63  abase .** connec
3cd0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65  tion pointers ge
3ce0: 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69  t out-of-sync, i
3cf0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
3d00: 72 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a  r routines like.
3d10: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
3d20: 28 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20  () to reference 
3d30: 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74  an stale connect
3d40: 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74  ion pointer that
3d50: 20 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a   references a.**
3d60: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68   a connection th
3d70: 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 63  at has already c
3d80: 6c 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75  losed.  This rou
3d90: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3da0: 69 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20  ide assert().** 
3db0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20  statements only 
3dc0: 61 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72 70  and for the purp
3dd0: 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68  ose of double-ch
3de0: 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20  ecking that the 
3df0: 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f  btree code.** do
3e00: 65 73 20 6b 65 65 70 20 74 68 65 20 64 61 74 61  es keep the data
3e10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
3e20: 70 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64  pointers up-to-d
3e30: 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
3e40: 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  nt cursorOwnsBtS
3e50: 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a  hared(BtCursor *
3e60: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  p){.  assert( cu
3e70: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
3e80: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ) );.  return (p
3e90: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d  ->pBtree->db==p-
3ea0: 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e  >pBt->db);.}.#en
3eb0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  dif../*.** Inval
3ec0: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3ed0: 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20  ow cache of the 
3ee0: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
3ef0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
3f00: 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ent..** on the s
3f10: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3f20: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64  cture pBt..*/.#d
3f30: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f40: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
3f50: 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  ur) (pCur->curFl
3f60: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c  ags &= ~BTCF_Val
3f70: 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49  idOvfl)../*.** I
3f80: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3f90: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
3fa0: 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63   cache for all c
3fb0: 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
3fc0: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
3fd0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
3fe0: 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Bt..*/.static vo
3ff0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  id invalidateAll
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
4010: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
4020: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61  BtCursor *p;.  a
4030: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
4040: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
4050: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70  utex) );.  for(p
4060: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
4070: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4080: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
4090: 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20  rflowCache(p);. 
40a0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
40b0: 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
40c0: 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  OB./*.** This fu
40d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
40e0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
40f0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
4100: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
4110: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
4120: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
4130: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
4140: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
4150: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
4160: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
4170: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
4180: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
4190: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
41a0: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
41b0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
41c0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
41d0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
41e0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
41f0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
4200: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
4210: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
4220: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
4230: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
4240: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
4250: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
4260: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
4270: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
4280: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
4290: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
42a0: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
42b0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
42c0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
42d0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
42e0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
42f0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
4300: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
4310: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
4320: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
4330: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4350: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4360: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e  o check */.  Pgn
4370: 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20  o pgnoRoot,     
4380: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
4390: 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  e that might be 
43a0: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36  changing */.  i6
43b0: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
43c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
43d0: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
43e0: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
43f0: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4400: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4410: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
4420: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
4430: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4440: 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e  ;.  if( pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d  hasIncrblobCur==
4460: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4470: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4480: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4490: 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65  ree) );.  pBtree
44a0: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
44b0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42   = 0;.  for(p=pB
44c0: 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
44d0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
44e0: 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  t){.    if( (p->
44f0: 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
4500: 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a  Incrblob)!=0 ){.
4510: 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61        pBtree->ha
4520: 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31  sIncrblobCur = 1
4530: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
4540: 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f  gnoRoot==pgnoRoo
4550: 74 20 26 26 20 28 69 73 43 6c 65 61 72 54 61 62  t && (isClearTab
4560: 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b  le || p->info.nK
4570: 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20  ey==iRow) ){.   
4580: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4590: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
45a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
45b0: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
45c0: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
45d0: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
45e0: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
45f0: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4600: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77  ncrblobCursors(w
4610: 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  ,x,y,z).#endif /
4620: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4630: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4640: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4650: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4660: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4670: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
4680: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
4690: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
46a0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
46b0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
46c0: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
46d0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
46e0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
46f0: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
4700: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
4710: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4720: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4730: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4740: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4750: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
4760: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
4770: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
4780: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
4790: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
47a0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
47b0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
47c0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
47d0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
47e0: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
47f0: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
4800: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
4810: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4820: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4830: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4840: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4850: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
4860: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
4870: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
4880: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
4890: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
48a0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
48b0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
48c0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
48d0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
48e0: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
48f0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4900: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4910: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4920: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4930: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4940: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4950: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
4960: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
4970: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
4980: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
4990: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
49a0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
49b0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
49c0: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
49d0: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
49e0: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
49f0: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4a00: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4a10: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4a20: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4a30: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4a40: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4a50: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
4a60: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
4a70: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
4a80: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
4a90: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4aa0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4ab0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4ac0: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4ad0: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4ae0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4af0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4b00: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4b10: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4b20: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4b30: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4b40: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4b50: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
4b60: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
4b70: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
4b80: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
4b90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4ba0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4bb0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4bc0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4bd0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4be0: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4bf0: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4c00: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4c10: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4c20: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4c30: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4c40: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4c50: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
4c60: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
4c70: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
4c80: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
4c90: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4ca0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4cb0: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4cc0: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4cd0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4ce0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4cf0: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4d00: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4d10: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4d20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4d30: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4d40: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4d50: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4d60: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
4d70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4d80: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4d90: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4da0: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4db0: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4dc0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4dd0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4de0: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4df0: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4e00: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4e10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4e20: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
4e30: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
4e40: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
4e50: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
4e60: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
4e70: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
4e80: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4e90: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
4ea0: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
4eb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4ec0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
4ed0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4ee0: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
4ef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4f00: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
4f10: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4f20: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
4f30: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
4f40: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
4f50: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
4f60: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
4f70: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
4f80: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
4f90: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
4fa0: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
4fb0: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
4fc0: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
4fd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4fe0: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
4ff0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5000: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
5010: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
5020: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
5030: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
5040: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5050: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
5060: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
5070: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
5080: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
5090: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
50a0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
50b0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
50c0: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
50d0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
50e0: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
50f0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5100: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
5110: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
5120: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
5130: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
5140: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
5150: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
5160: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
5170: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
5180: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
5190: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
51a0: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
51b0: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
51c0: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
51d0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
51e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
51f0: 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
5200: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5210: 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  <pCur->iPage; i+
5220: 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
5230: 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
5240: 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
5250: 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
5260: 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
5270: 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43  ->pPage);.    pC
5280: 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
5290: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
52a0: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
52b0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
52c0: 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ent must point t
52d0: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a  o a valid entry.
52e0: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
52f0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
5300: 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74  (i.e. have eStat
5310: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5320: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5330: 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72  on saves the cur
5340: 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20  rent cursor key 
5350: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75  in variables pCu
5360: 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70  r->nKey and.** p
5370: 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54  Cur->pKey. SQLIT
5380: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
5390: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
53a0: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
53b0: 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  r .** code other
53c0: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
53d0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
53e0: 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74  n on an intkey t
53f0: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69  able, then the i
5400: 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74  nteger key.** (t
5410: 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f  he rowid) is sto
5420: 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  red in pCur->nKe
5430: 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79  y and pCur->pKey
5440: 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a   is left set to.
5450: 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  ** NULL. If the 
5460: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5470: 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74  n a non-intkey t
5480: 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d  able, then pCur-
5490: 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74  >pKey is .** set
54a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d   to point to a m
54b0: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70  alloced buffer p
54c0: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
54d0: 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
54e0: 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a  ng .** the key..
54f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5500: 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75  veCursorKey(BtCu
5510: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
5520: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5530: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  K;.  assert( CUR
5540: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5550: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
5560: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5570: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5580: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5590: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
55a0: 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
55b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
55c0: 74 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71  the rowid is req
55d0: 75 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c  uired for a tabl
55e0: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70  e btree */.    p
55f0: 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69  Cur->nKey = sqli
5600: 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b  te3BtreeIntegerK
5610: 65 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  ey(pCur);.  }els
5620: 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  e{.    /* For an
5630: 20 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61   index btree, sa
5640: 76 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ve the complete 
5650: 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  key content */. 
5660: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20     void *pKey;. 
5670: 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20     pCur->nKey = 
5680: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
5690: 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20  oadSize(pCur);. 
56a0: 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65     pKey = sqlite
56b0: 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e  3Malloc( pCur->n
56c0: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
56d0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
56e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
56f0: 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28  yload(pCur, 0, (
5700: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
5710: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
5720: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5730: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
5740: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
5750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5760: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5770: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
5780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
5790: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
57a0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
57b0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
57c0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
57d0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
57e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
57f0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
5800: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5810: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5820: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5830: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5840: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5850: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5860: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5870: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5880: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5890: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
58a0: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
58b0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
58c0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
58d0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
58e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
58f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5900: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5910: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5920: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5930: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5940: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5950: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5960: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5970: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5980: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5990: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
59a0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
59b0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
59c0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
59d0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
59e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
59f0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
5a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5a10: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5a20: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5a30: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5a40: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5a50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5a60: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5a70: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5a80: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a90: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5aa0: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  EEK;.  }..  pCur
5ab0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
5ac0: 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
5ad0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
5ae0: 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65  CF_AtLast);.  re
5af0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
5b00: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5b10: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
5b20: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5b30: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5b40: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
5b50: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
5b60: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
5b70: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
5b80: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
5b90: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
5ba0: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
5bb0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
5bc0: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
5bd0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
5be0: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
5bf0: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
5c00: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
5c10: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
5c20: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
5c30: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
5c40: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
5c50: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
5c60: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
5c70: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
5c80: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
5c90: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5ca0: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
5cb0: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
5cc0: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
5cd0: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
5ce0: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
5cf0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5d00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
5d10: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
5d20: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
5d30: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
5d40: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
5d50: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
5d60: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
5d70: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
5d80: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
5d90: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
5da0: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
5db0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5dc0: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
5dd0: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
5de0: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
5df0: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
5e00: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5e10: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
5e20: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
5e30: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
5e40: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
5e50: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
5e60: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
5e70: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
5e80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
5e90: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
5ea0: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
5eb0: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
5ec0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
5ed0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
5ee0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
5ef0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
5f00: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
5f10: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
5f20: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
5f30: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
5f40: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
5f50: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
5f60: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
5f70: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
5f80: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
5f90: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
5fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5fb0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
5fc0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5fd0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
5fe0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
5ff0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
6000: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6010: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6020: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
6030: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
6040: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
6050: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
6060: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
6070: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
6080: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6090: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
60a0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
60b0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
60c0: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
60d0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
60e0: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
60f0: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
6100: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
6110: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
6120: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
6130: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6140: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
6150: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
6160: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
6170: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
6180: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
6190: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
61a0: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
61b0: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
61c0: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
61d0: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
61e0: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
61f0: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
6200: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
6210: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6220: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
6230: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
6240: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
6250: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
6260: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
6270: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6280: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6290: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
62a0: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
62b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
62c0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
62d0: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
62e0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
62f0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
6300: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6310: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6320: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6330: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6340: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6350: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6360: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6370: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6380: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6390: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
63a0: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
63b0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
63c0: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
63d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
63e0: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
63f0: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
6400: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6410: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6420: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6430: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6440: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6460: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6470: 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  age>=0 );.      
6480: 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
6490: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
64a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
64b0: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
64c0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a  .  }while( p );.
64d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
64e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
64f0: 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ar the current c
6500: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
6510: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
6520: 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
6530: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6540: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
6550: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
6560: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
6570: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6580: 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20  .  pCur->pKey = 
6590: 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  0;.  pCur->eStat
65a0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
65b0: 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20  ID;.}../*.** In 
65c0: 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  this version of 
65d0: 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65  BtreeMoveto, pKe
65e0: 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e  y is a packed in
65f0: 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75  dex record.** su
6600: 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74  ch as is generat
6610: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
6620: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20  eRecord opcode. 
6630: 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72   Unpack the.** r
6640: 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63  ecord and then c
6650: 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55  all BtreeMovetoU
6660: 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20  npacked() to do 
6670: 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61  the work..*/.sta
6680: 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76  tic int btreeMov
6690: 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20  eto(.  BtCursor 
66a0: 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75  *pCur,     /* Cu
66b0: 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  rsor open on the
66c0: 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61   btree to be sea
66d0: 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  rched */.  const
66e0: 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
66f0: 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20  * Packed key if 
6700: 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20  the btree is an 
6710: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e  index */.  i64 n
6720: 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
6730: 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  * Integer key fo
6740: 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20  r tables.  Size 
6750: 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69  of pKey for indi
6760: 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  ces */.  int bia
6770: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
6780: 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74  Bias search to t
6790: 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
67a0: 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
67b0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
67c0: 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
67d0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
67e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
67f0: 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63       /* Status c
6800: 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ode */.  Unpacke
6810: 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
6820: 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ;   /* Unpacked 
6830: 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20  index key */..  
6840: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
6850: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
6860: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
6870: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
6880: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
6890: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 43 75  packedRecord(pCu
68a0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  r->pKeyInfo);.  
68b0: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
68c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
68d0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
68e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
68f0: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6900: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6910: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6920: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6930: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6940: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6950: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6960: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
6970: 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  eto_done;.    }.
6980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
6990: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
69a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
69b0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
69c0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
69d0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
69e0: 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20  ;.moveto_done:. 
69f0: 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
6a00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6a10: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
6a20: 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a  ->db, pIdxKey);.
6a30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6a40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
6a50: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
6a60: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
6a70: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
6a80: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
6a90: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
6aa0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6ab0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
6ac0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
6ad0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
6ae0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
6af0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
6b00: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6b10: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
6b20: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
6b30: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
6b40: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6b50: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
6b60: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
6b70: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
6b80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
6b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6ba0: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
6bb0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
6bc0: 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65  rc;.  int skipNe
6bd0: 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  xt;.  assert( cu
6be0: 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
6bf0: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
6c00: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6c10: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
6c20: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
6c30: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6c40: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
6c50: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
6c60: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
6c70: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6c80: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
6c90: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
6ca0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
6cb0: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
6cc0: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
6cd0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6ce0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6cf0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6d00: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
6d10: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
6d20: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6d30: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6d40: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d50: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
6d60: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
6d70: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
6d80: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
6d90: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
6da0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6db0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
6dc0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6dd0: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6de0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6df0: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6e00: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6e10: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6e20: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6e30: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6e40: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6e50: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6e60: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
6e70: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
6e80: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
6e90: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
6ea0: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6eb0: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
6ec0: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
6ed0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
6ee0: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
6ef0: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
6f00: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
6f10: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6f20: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6f30: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6f40: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6f50: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
6f60: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
6f70: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
6f80: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
6f90: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
6fa0: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
6fb0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6fc0: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
6fd0: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
6fe0: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
6ff0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
7000: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
7010: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
7020: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
7030: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
7040: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
7050: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
7060: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7070: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
7080: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
7090: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
70a0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
70b0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
70c0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
70d0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
70e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
70f0: 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72 20  a fake BtCursor 
7100: 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c 6c  object that will
7110: 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a 2a   always answer.*
7120: 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20 73  * false to the s
7130: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7140: 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75 74  rHasMoved() rout
7150: 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65 20  ine above.  The 
7160: 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20 72  fake.** cursor r
7170: 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f 74  eturned must not
7180: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e   be used with an
7190: 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69 6e  y other Btree in
71a0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43 75  terface..*/.BtCu
71b0: 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74 72  rsor *sqlite3Btr
71c0: 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73 6f  eeFakeValidCurso
71d0: 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
71e0: 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72 20  c u8 fakeCursor 
71f0: 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
7200: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
7210: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
7220: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ate)==0 );.  ret
7230: 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29 26  urn (BtCursor*)&
7240: 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f  fakeCursor;.}../
7250: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7260: 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72  e restores a cur
7270: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
7280: 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f  original positio
7290: 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61  n after it.** ha
72a0: 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20  s been moved by 
72b0: 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74  some outside act
72c0: 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61  ivity (such as a
72d0: 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65   btree rebalance
72e0: 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76   or.** a row hav
72f0: 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ing been deleted
7300: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
7310: 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a  the cursor).  .*
7320: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
7330: 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74   the *pDifferent
7340: 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73  Row parameter is
7350: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75   false if the cu
7360: 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  rsor is left.** 
7370: 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63  pointing at exac
7380: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77  tly the same row
7390: 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77  .  *pDifferntRow
73a0: 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20   is the row the 
73b0: 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f  cursor.** was po
73c0: 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65  inting to has be
73d0: 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63  en deleted, forc
73e0: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
73f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a  o point to some.
7400: 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a  ** nearby row..*
7410: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7420: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
7430: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75   called for a cu
7440: 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72  rsor that just r
7450: 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20  eturned.** TRUE 
7460: 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
7470: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
7480: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7490: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
74a0: 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ore(BtCursor *pC
74b0: 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72  ur, int *pDiffer
74c0: 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72  entRow){.  int r
74d0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  c;..  assert( pC
74e0: 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ur!=0 );.  asser
74f0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
7500: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
7510: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
7520: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
7530: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
7540: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7550: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
7560: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
7570: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
7580: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
7590: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
75a0: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
75b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
75c0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29  r->skipNext==0 )
75d0: 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  ;.    *pDifferen
75e0: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tRow = 0;.  }.  
75f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7600: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
7610: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
7620: 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f  _HINTS./*.** Pro
7630: 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68  vide hints to th
7640: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70  e cursor.  The p
7650: 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67  articular hint g
7660: 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79  iven (and the ty
7670: 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72  pe.** and number
7680: 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73 20   of the varargs 
7690: 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20 64  parameters) is d
76a0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
76b0: 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61   eHintType.** pa
76c0: 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68  rameter.  See th
76d0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  e definitions of
76e0: 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f   the BTREE_HINT_
76f0: 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74  * macros for det
7700: 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ails..*/.void sq
7710: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7720: 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Hint(BtCursor *p
7730: 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79  Cur, int eHintTy
7740: 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55  pe, ...){.  /* U
7750: 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74  sed only by syst
7760: 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74 75  em that substitu
7770: 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f  te their own sto
7780: 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d  rage engine */.}
7790: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
77a0: 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74  rovide flag hint
77b0: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
77c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
77d0: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46  BtreeCursorHintF
77e0: 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
77f0: 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29  Cur, unsigned x)
7800: 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42  {.  assert( x==B
7810: 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20  TREE_SEEK_EQ || 
7820: 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  x==BTREE_BULKLOA
7830: 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70  D || x==0 );.  p
7840: 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a  Cur->hints = x;.
7850: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
7860: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7870: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
7880: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7890: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
78a0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
78b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
78c0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
78d0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
78e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
78f0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
7900: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
7910: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
7920: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
7930: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
7940: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
7950: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
7960: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7970: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
7980: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
7990: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
79a0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
79b0: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
79c0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
79d0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
79e0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
79f0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7a00: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
7a10: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
7a20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7a30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7a40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
7a50: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
7a60: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
7a70: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
7a80: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
7a90: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
7aa0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7ab0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
7ac0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7ad0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7ae0: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
7af0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7b00: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
7b10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
7b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
7b30: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
7b40: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7b50: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7b60: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7b70: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7b80: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7b90: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7ba0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7bb0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7bc0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7bd0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
7be0: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7bf0: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7c00: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
7c10: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7c20: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
7c30: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7c40: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
7c50: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
7c60: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7c70: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7c80: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
7c90: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7ca0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7cb0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
7cc0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7cd0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7ce0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7cf0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7d00: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7d10: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7d20: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7d30: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7d40: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7d50: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7d60: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7d70: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7d80: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7d90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7da0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7db0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7dc0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7dd0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7de0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7df0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7e00: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7e10: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7e20: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7e30: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7e40: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7e50: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7e60: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7e70: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7e80: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7e90: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7ea0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7eb0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7ec0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7ed0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7ee0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7ef0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7f00: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7f10: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7f20: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7f30: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7f40: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7f50: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
7f60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7f70: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7f80: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7f90: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7fa0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7fb0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7fc0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
7fd0: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
7fe0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7ff0: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
8000: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
8010: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
8020: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
8030: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
8040: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
8050: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
8060: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
8070: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
8080: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
8090: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
80a0: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
80b0: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
80c0: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
80d0: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
80e0: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
80f0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
8100: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
8110: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
8120: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8130: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
8140: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
8150: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
8160: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8170: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
8180: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
8190: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
81a0: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
81b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
81c0: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
81d0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
81e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
81f0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
8200: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8210: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
8220: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
8230: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
8240: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
8250: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
8260: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
8270: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
8280: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
8290: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
82a0: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
82b0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
82c0: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
82d0: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
82e0: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
82f0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
8300: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
8310: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
8320: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
8330: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
8340: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
8350: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8360: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
8370: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8380: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8390: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
83a0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
83b0: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
83c0: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
83d0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
83e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
83f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
8400: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
8410: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
8420: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
8430: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
8440: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
8450: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
8460: 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  DbPage, 0);.  if
8470: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
8480: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8490: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
84a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
84b0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
84c0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
84d0: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
84e0: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
84f0: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
8500: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8510: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8530: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
8540: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8550: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
8560: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
8570: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
8580: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
8590: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
85a0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
85b0: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
85c0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
85d0: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
85e0: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
85f0: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
8600: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
8610: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
8620: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
8630: 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75  iPtrmap);.  retu
8640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8650: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8660: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8670: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8680: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8690: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
86a0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
86b0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
86c0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
86d0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
86e0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
86f0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
8700: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
8710: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
8720: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
8730: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
8740: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8750: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8760: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8770: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8780: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8790: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
87a0: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
87b0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
87c0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
87d0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
87e0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
87f0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
8800: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
8810: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
8820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8830: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
8840: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8850: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8860: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8870: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8880: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8890: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
88a0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
88b0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
88c0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
88d0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
88e0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
88f0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
8900: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8910: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8920: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8930: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
8940: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8950: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8960: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8970: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8980: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8990: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
89a0: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
89b0: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
89c0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
89d0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
89e0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
89f0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
8a00: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
8a10: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
8a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8a30: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8a40: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8a50: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8a60: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8a70: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8a80: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8a90: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8aa0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8ac0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8ad0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8ae0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
8af0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8b00: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8b10: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
8b20: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8b30: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8b40: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8b50: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8b60: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8b70: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8b80: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8b90: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8ba0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
8bb0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
8bc0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
8bd0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
8be0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
8bf0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
8c00: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8c10: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8c20: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8c30: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8c40: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8c50: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8c60: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8c70: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8c80: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8c90: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8ca0: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
8cb0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
8cc0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
8cd0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
8ce0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8cf0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8d00: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8d10: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8d20: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8d30: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8d40: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8d50: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8d60: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8d70: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8d80: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8d90: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
8da0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8db0: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
8dc0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8dd0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
8de0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
8df0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8e00: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8e10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e20: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8e30: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8e40: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8e50: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8e60: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8e70: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8e80: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8e90: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8ea0: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8eb0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8ec0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8ed0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8ee0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
8ef0: 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64  &pInfo->pPayload
8f00: 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20  [pInfo->nLocal] 
8f10: 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a  - pCell) + 4;.}.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8f30: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8f40: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8f50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8f60: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8f70: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8f80: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8f90: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8fa0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8fb0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8fc0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8fd0: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
8fe0: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8ff0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
9000: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
9010: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
9020: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
9030: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
9040: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
9050: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
9060: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
9070: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
9080: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
9090: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
90a0: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
90b0: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
90c0: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
90d0: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
90e0: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
90f0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
9100: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
9110: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9120: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
9130: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
9140: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9150: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9160: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9170: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9190: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
91a0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
91b0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
91c0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
91d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
91e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
91f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9200: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9210: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9220: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
9230: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9240: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
9250: 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =4 );.#ifndef SQ
9260: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9270: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
9280: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  age);.#endif.  p
9290: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
92a0: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
92b0: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
92c0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
92d0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
92e0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
92f0: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
9300: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >pPayload = 0;. 
9310: 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69   return;.}.stati
9320: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
9330: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
9340: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9350: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9360: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9370: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9390: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
93a0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
93b0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
93c0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
93d0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
93e0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
93f0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9400: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9410: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9420: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9430: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9440: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9450: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9460: 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20  /.  u64 iKey;   
9470: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9480: 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c  xtracted Key val
9490: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
94a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
94b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
94c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
94d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
94e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
94f0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
9500: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
9510: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
9520: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9530: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
9540: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
9550: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9560: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9570: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9580: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9590: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
95a0: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
95b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
95c0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
95d0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
95e0: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
95f0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9600: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9610: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9620: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9630: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9640: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9650: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9660: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9670: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9680: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9690: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
96a0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
96b0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
96c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
96d0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
96e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
96f0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9700: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9710: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
9720: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
9730: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9740: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9750: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9760: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
9770: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9780: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
9790: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
97a0: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
97b0: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
97c0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
97d0: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
97e0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
97f0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
9800: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
9810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
9820: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
9830: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
9840: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
9850: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
9860: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9870: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9880: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9890: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
98a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
98b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
98c0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
98d0: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
98e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
98f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9900: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9910: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9920: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9930: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9940: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9950: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9960: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9970: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9980: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9990: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
99a0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
99b0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
99c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
99d0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
99e0: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
99f0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9a00: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9a10: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9a20: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9a30: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9a40: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9a60: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9a70: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9a80: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9a90: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9aa0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9ab0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9ac0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9ad0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9ae0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9af0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
9b00: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9b10: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9b20: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9b30: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9b40: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9b50: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9b60: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9b70: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
9b80: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
9b90: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
9ba0: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
9bb0: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
9bc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9bd0: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
9be0: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
9bf0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9c00: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9c10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9c20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9c30: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9c40: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9c50: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9c60: 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70  eyLeaf==0 );.  p
9c70: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9c80: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9c90: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9ca0: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9cb0: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9cc0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9cd0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9ce0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9cf0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9d00: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9d10: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9d20: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9d30: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9d40: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9d50: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9d60: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9d70: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9d80: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9d90: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9da0: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9db0: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9dc0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9dd0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9de0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9df0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9e00: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9e10: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9e20: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9e30: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9e40: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9e50: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9e60: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9e70: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9e80: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9e90: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9ea0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9eb0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9ec0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9ed0: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9ee0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9ef0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9f00: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9f10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9f20: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9f30: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9f40: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9f50: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9f60: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9f70: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9f80: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9f90: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9fa0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9fb0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9fc0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9fd0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9ff0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
a000: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
a010: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
a020: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a030: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a040: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a050: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a060: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
a070: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
a080: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
a090: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a0a0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
a0b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
a0c0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
a0d0: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
a0e0: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
a0f0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
a100: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
a110: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
a120: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
a130: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
a140: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
a150: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
a160: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
a170: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
a180: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
a190: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
a1a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
a1b0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
a1c0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
a1d0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
a1e0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a1f0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
a200: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
a210: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a220: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a230: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a240: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a250: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a260: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a270: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a280: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a290: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a2a0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a2b0: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a2c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a2d0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a2e0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a310: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a320: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a360: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a370: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a380: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a390: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a3a0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a3b0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a3c0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a3d0: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a3e0: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a3f0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a400: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a410: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a420: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a430: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a440: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a450: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a460: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a470: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a480: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a490: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a4a0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a4b0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a4c0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a4d0: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a4e0: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
a4f0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
a500: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
a510: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a520: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a530: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a540: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a550: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a560: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a570: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a580: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a590: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a5a0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a5b0: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a5c0: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a5d0: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a5e0: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a5f0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a600: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a610: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a620: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a630: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a640: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a650: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a660: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a670: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a680: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a690: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a6a0: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a6b0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a6c0: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a6d0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a6e0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a6f0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a700: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a710: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a720: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a730: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a740: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a750: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a760: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a770: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a780: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a790: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a7a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a7b0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a7c0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a7d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a7e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a7f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a800: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a810: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a820: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a830: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a840: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a850: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a860: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a870: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a880: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a890: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a8a0: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a8b0: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a8c0: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a8d0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a8e0: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a8f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a900: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a910: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a920: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a930: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a940: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a950: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a960: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a980: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a990: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a9a0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a9b0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a9c0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a9d0: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a9e0: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a9f0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
aa00: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
aa10: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
aa20: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
aa30: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
aa40: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
aa50: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
aa60: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
aa70: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
aa80: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
aa90: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
aaa0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
aab0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
aac0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
aad0: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
aae0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
aaf0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
ab00: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
ab10: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
ab20: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
ab30: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
ab40: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
ab50: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
ab60: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
ab70: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
ab80: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
ab90: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
aba0: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
abb0: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
abc0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
abd0: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
abe0: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
abf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ac00: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
ac10: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
ac20: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
ac30: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
ac40: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
ac50: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
ac60: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
ac70: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
ac80: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
ac90: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
aca0: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
acb0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
acc0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
acd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ace0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
acf0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
ad00: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
ad10: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
ad20: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
ad30: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
ad40: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
ad50: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
ad60: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
ad70: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
ad80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ad90: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
ada0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
adb0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
adc0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
add0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
ade0: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
adf0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
ae00: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
ae10: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ae20: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ae30: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
ae40: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
ae50: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
ae60: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
ae70: 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b  [info.nSize-4]);
ae80: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
ae90: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
aea0: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
aeb0: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
aec0: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
aed0: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
aee0: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
aef0: 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  iven. This routi
af00: 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63  ne reorganizes c
af10: 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a  ells within the.
af20: 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ** page so that 
af30: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
af40: 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  e-blocks on the 
af50: 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e  free-block list.
af60: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
af70: 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68 65   nMaxFrag is the
af80: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
af90: 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70  of fragmented sp
afa0: 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ace that may be.
afb0: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
afc0: 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68 69  e page after thi
afd0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
afe0: 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  s..**.** EVIDENC
aff0: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
b000: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
b010: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
b020: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
b030: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
b040: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
b050: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
b060: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
b070: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
b080: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
b090: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
b0a0: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
b0b0: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
b0c0: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
b0d0: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
b0e0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
b0f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
b100: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
b110: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
b120: 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74  nMaxFrag){.  int
b130: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b140: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b150: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
b160: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
b170: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b180: 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  ss of the i-th c
b190: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ell */.  int hdr
b1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b1b0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b1c0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
b1d0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
b200: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
b210: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
b220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b230: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
b240: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
b250: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
b260: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b270: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
b280: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
b290: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
b2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b2b0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
b2c0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
b2d0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b2f0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
b300: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b310: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b320: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
b330: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
b340: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b350: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
b360: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
b370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
b380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b390: 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  src;        /* S
b3a0: 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74  ource of content
b3b0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
b3c0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
b3d0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b3e0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b3f0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
b400: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
b410: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
b420: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  cell index */.. 
b430: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b440: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b450: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b470: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b480: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b490: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b4a0: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b4b0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b4c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b4d0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b4e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b4f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b500: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b510: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b520: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b530: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b540: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b550: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b560: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b570: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b580: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b590: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b5a0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b5b0: 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69  3]) );.  iCellFi
b5c0: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b5d0: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73   + 2*nCell;.  us
b5e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
b5f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b600: 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  e;..  /* This bl
b610: 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65  ock handles page
b620: 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65  s with two or fe
b630: 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  wer free blocks 
b640: 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a  and nMaxFrag.  *
b650: 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d  * or fewer fragm
b660: 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20  ented bytes. In 
b670: 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
b680: 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74  faster to move t
b690: 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20  he.  ** two (or 
b6a0: 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63  one) blocks of c
b6b0: 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f  ells using memmo
b6c0: 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68 65  ve() and add the
b6d0: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f   required.  ** o
b6e0: 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20 70  ffsets to each p
b6f0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65  ointer in the ce
b700: 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
b710: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a   than it is to .
b720: 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74    ** reconstruct
b730: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
b740: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74  .  */.  if( (int
b750: 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d  )data[hdr+7]<=nM
b760: 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e  axFrag ){.    in
b770: 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62 79  t iFree = get2by
b780: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
b790: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20  ;.    if( iFree 
b7a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72  ){.      int iFr
b7b0: 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  ee2 = get2byte(&
b7c0: 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20  data[iFree]);.. 
b7d0: 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e 64       /* pageFind
b7e0: 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65 61  Slot() has alrea
b7f0: 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61 74  dy verified that
b800: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72 65   free blocks are
b810: 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a 2a   sorted.      **
b820: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66 66   in order of off
b830: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 70  set within the p
b840: 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f  age, and that no
b850: 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20   block extends. 
b860: 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65       ** past the
b870: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b880: 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20 74  . Provided the t
b890: 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64 6f  wo free slots do
b8a0: 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f   not .      ** o
b8b0: 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75 61  verlap, this gua
b8c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
b8d0: 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73   memmove() calls
b8e0: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
b8f0: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69        ** overwri
b900: 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69 7a  te the usableSiz
b910: 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20 65  e byte buffer, e
b920: 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  ven if the datab
b930: 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ase page.      *
b940: 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a  * is corrupt.  *
b950: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
b960: 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72  iFree2==0 || iFr
b970: 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20 20  ee2>iFree );.   
b980: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
b990: 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  +get2byte(&data[
b9a0: 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61  iFree+2]) <= usa
b9b0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
b9c0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d   assert( iFree2=
b9d0: 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65 74  =0 || iFree2+get
b9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b9f0: 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  e2+2]) <= usable
ba00: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  Size );..      i
ba10: 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20  f( 0==iFree2 || 
ba20: 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30  (data[iFree2]==0
ba30: 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32 2b   && data[iFree2+
ba40: 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  1]==0) ){.      
ba50: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64 61    u8 *pEnd = &da
ba60: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
ba70: 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20  nCell*2];.      
ba80: 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20 20    u8 *pAddr;.   
ba90: 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20 30       int sz2 = 0
baa0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
bab0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bac0: 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20  a[iFree+2]);.   
bad0: 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20 67       int top = g
bae0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
baf0: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  r+5]);.        i
bb00: 66 28 20 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b  f( top>=iFree ){
bb10: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bb20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bb30: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
bb40: 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
bb50: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 32        if( iFree2
bb60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
bb70: 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d  sert( iFree+sz<=
bb80: 69 46 72 65 65 32 20 29 3b 20 2f 2a 20 56 65 72  iFree2 ); /* Ver
bb90: 69 66 69 65 64 20 62 79 20 70 61 67 65 46 69 6e  ified by pageFin
bba0: 64 53 6c 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20  dSlot() */.     
bbb0: 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32 62       sz2 = get2b
bbc0: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32  yte(&data[iFree2
bbd0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  +2]);.          
bbe0: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 73 7a  assert( iFree+sz
bbf0: 2b 73 7a 32 2b 69 46 72 65 65 32 2d 28 69 46 72  +sz2+iFree2-(iFr
bc00: 65 65 2b 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65  ee+sz) <= usable
bc10: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
bc20: 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b    memmove(&data[
bc30: 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26  iFree+sz+sz2], &
bc40: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20  data[iFree+sz], 
bc50: 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a  iFree2-(iFree+sz
bc60: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  ));.          sz
bc70: 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20 20 20   += sz2;.       
bc80: 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72 6b 20   }.        cbrk 
bc90: 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20  = top+sz;.      
bca0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 28    assert( cbrk+(
bcb0: 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73  iFree-top) <= us
bcc0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
bcd0: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
bce0: 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74  a[cbrk], &data[t
bcf0: 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b  op], iFree-top);
bd00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 41 64  .        for(pAd
bd10: 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  dr=&data[cellOff
bd20: 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64  set]; pAddr<pEnd
bd30: 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20  ; pAddr+=2){.   
bd40: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bd50: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
bd60: 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 46         if( pc<iF
bd70: 72 65 65 20 29 7b 20 70 75 74 32 62 79 74 65 28  ree ){ put2byte(
bd80: 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d  pAddr, pc+sz); }
bd90: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
bda0: 69 66 28 20 70 63 3c 69 46 72 65 65 32 20 29 7b  if( pc<iFree2 ){
bdb0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
bdc0: 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20   pc+sz2); }.    
bdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
bde0: 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75  to defragment_ou
bdf0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
be00: 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75  .  }..  cbrk = u
be10: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
be20: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
be30: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
be40: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
be50: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
be60: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
be70: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
be80: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
be90: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
bea0: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
beb0: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
bec0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
bed0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bee0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
bef0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
bf00: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
bf10: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
bf20: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
bf30: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
bf40: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
bf50: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
bf60: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
bf70: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
bf80: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
bf90: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
bfa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bfb0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
bfc0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
bfd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
bfe0: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
bff0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
c000: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
c010: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
c020: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
c030: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
c040: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
c050: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
c060: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
c070: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c080: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
c090: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
c0a0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
c0b0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
c0c0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
c0d0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c0e0: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
c0f0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
c100: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
c110: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
c120: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
c130: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
c140: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
c150: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
c160: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
c170: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
c180: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
c190: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
c1a0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
c1b0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
c1c0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
c1d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
c1e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
c1f0: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
c200: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
c210: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
c220: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
c230: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
c240: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
c250: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
c260: 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61  +7] = 0;.. defra
c270: 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28  gment_out:.  if(
c280: 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72   data[hdr+7]+cbr
c290: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
c2a0: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
c2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c2c0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
c2d0: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
c2e0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
c2f0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
c300: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
c310: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
c320: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
c330: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
c340: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
c350: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
c360: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
c370: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
c380: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c390: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c3a0: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
c3b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c3c0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
c3d0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
c3e0: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
c3f0: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
c400: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
c410: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
c420: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
c430: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
c440: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
c450: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
c460: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
c470: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
c480: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
c490: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
c4a0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
c4b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
c4c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
c4d0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
c4e0: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
c4f0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
c500: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
c510: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
c520: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
c530: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
c540: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
c550: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
c560: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
c570: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
c580: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
c590: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
c5a0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
c5b0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
c5c0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
c5d0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
c5e0: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
c5f0: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
c600: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
c610: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
c620: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
c630: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
c640: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
c650: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
c660: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
c670: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
c680: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
c690: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
c6a0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
c6b0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
c6c0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
c6d0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
c6e0: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
c6f0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  ableSize;.  int 
c700: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
c710: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
c720: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20  free slot */..  
c730: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
c740: 20 20 77 68 69 6c 65 28 20 70 63 3c 3d 75 73 61    while( pc<=usa
c750: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
c760: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c770: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
c780: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
c790: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
c7a0: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
c7b0: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
c7c0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c7d0: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
c7e0: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
c7f0: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
c800: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
c810: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
c820: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
c830: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
c840: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
c850: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
c860: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
c870: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
c880: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
c890: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  3 );.      if( s
c8a0: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
c8b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
c8c0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
c8d0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70  RUPT_PGNO(pPg->p
c8e0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65  gno);.        re
c8f0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
c900: 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20  lse if( x<4 ){. 
c910: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
c920: 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35  CE-OF: R-11498-5
c930: 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66  8022 In a well-f
c940: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
c950: 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20  e, the total.   
c960: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f       ** number o
c970: 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d  f bytes in fragm
c980: 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63  ents may not exc
c990: 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20  eed 60. */.     
c9a0: 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72     if( aData[hdr
c9b0: 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20  +7]>57 ) return 
c9c0: 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  0;..        /* R
c9d0: 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66  emove the slot f
c9e0: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
c9f0: 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75  t. Update the nu
ca00: 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20  mber of.        
ca10: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
ca20: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
ca30: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
ca40: 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41  memcpy(&aData[iA
ca50: 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d  ddr], &aData[pc]
ca60: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44  , 2);.        aD
ca70: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75  ata[hdr+7] += (u
ca80: 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  8)x;.      }else
ca90: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
caa0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
cab0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
cac0: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
cad0: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
cae0: 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70      ** for the p
caf0: 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74  ortion used by t
cb00: 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f  he new allocatio
cb10: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  n. */.        pu
cb20: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
cb30: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d  +2], x);.      }
cb40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61  .      return &a
cb50: 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20  Data[pc + x];.  
cb60: 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20    }.    iAddr = 
cb70: 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  pc;.    pc = get
cb80: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d  2byte(&aData[pc]
cb90: 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41  );.    if( pc<iA
cba0: 64 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b  ddr+size ) break
cbb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29  ;.  }.  if( pc )
cbc0: 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c  {.    *pRc = SQL
cbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
cbe0: 28 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  (pPg->pgno);.  }
cbf0: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
cc00: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
cc10: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
cc20: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
cc30: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
cc40: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
cc50: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
cc60: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
cc70: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
cc80: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
cc90: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
cca0: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ccb0: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ccc0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ccd0: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
cce0: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ccf0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
cd00: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
cd10: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
cd20: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
cd30: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
cd40: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
cd50: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
cd60: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
cd70: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
cd80: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
cd90: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
cda0: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
cdb0: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
cdc0: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
cdd0: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
cde0: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
cdf0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ce00: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ce10: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
ce20: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
ce30: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
ce40: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
ce50: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
ce60: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
ce70: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
ce80: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ce90: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
cea0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ceb0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
cec0: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ced0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
cee0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
cef0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
cf00: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
cf10: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
cf20: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
cf30: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
cf40: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
cf50: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
cf60: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
cf90: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
cfa0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
cfb0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cfc0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
cfd0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
cfe0: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
cff0: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
d000: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d010: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
d020: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
d030: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
d040: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
d050: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d060: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d070: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d080: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
d090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d0a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d0b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
d0c0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
d0d0: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
d0e0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d0f0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d100: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
d110: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
d120: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
d130: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
d140: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
d150: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
d160: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
d170: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
d180: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
d190: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
d1a0: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
d1b0: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
d1c0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
d1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
d1e0: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
d1f0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
d200: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
d210: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
d220: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
d230: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
d240: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
d250: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
d260: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
d270: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
d280: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
d290: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
d2a0: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
d2b0: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
d2c0: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
d2d0: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
d2e0: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
d2f0: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
d300: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
d310: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
d320: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
d330: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
d340: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
d350: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
d360: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
d370: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
d380: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
d390: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
d3a0: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
d3b0: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
d3c0: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
d3d0: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
d3e0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3f0: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
d400: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
d410: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
d420: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d430: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
d440: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
d450: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
d460: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
d470: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
d480: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
d490: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
d4a0: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
d4b0: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
d4c0: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
d4d0: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
d4e0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
d4f0: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
d500: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
d510: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
d520: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
d530: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
d540: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
d550: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
d560: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
d570: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
d580: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
d590: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
d5a0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
d5b0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
d5c0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
d5d0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
d5e0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
d5f0: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
d600: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d610: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
d620: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
d630: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
d640: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
d650: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
d660: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d670: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
d680: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
d690: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d6a0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
d6b0: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
d6c0: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
d6d0: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
d6e0: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
d6f0: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
d700: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
d710: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
d720: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
d730: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
d740: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
d750: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
d760: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
d770: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
d780: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
d790: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c  gmentPage(pPage,
d7a0: 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e   MIN(4, pPage->n
d7b0: 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29  Free - (2+nByte)
d7c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
d7d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d7e0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
d7f0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
d800: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
d810: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f   gap+2+nByte<=to
d820: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
d830: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
d840: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
d850: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
d860: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
d870: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
d880: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
d890: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
d8a0: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
d8b0: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
d8c0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
d8d0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
d8e0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
d8f0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
d900: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
d910: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
d920: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
d930: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
d940: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
d950: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
d960: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
d970: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
d980: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
d990: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
d9a0: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
d9b0: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
d9c0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
d9d0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d9e0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
d9f0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
da00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
da10: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
da20: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
da30: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
da40: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
da50: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
da60: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
da70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
da80: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
da90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
daa0: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
dab0: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
dac0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
dad0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
dae0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
daf0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
db00: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
db10: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
db20: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
db30: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
db40: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
db50: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
db60: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
db70: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
db80: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
db90: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
dba0: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
dbb0: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
dbc0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
dbd0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
dbe0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
dbf0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
dc00: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
dc10: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
dc20: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dc30: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
dc40: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
dc50: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
dc60: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
dc70: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
dc80: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
dc90: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
dcc0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
dcd0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
dce0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
dd10: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
dd20: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd50: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
dd60: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
dd70: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75           /* Redu
dda0: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
ddb0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
ddc0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
ddd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
dde0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
ddf0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
de00: 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20 20    u16 x;        
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
de30: 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
de40: 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20  t area */.  u32 
de50: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
de60: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
de70: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
de80: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
de90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
dea0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
deb0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
dec0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
ded0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
dee0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
def0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
df00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
df10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
df20: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
df30: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
df40: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
df50: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
df60: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
df70: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
df80: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
df90: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
dfa0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
dfb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dfc0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
dfd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
dfe0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
dff0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
e000: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
e010: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
e020: 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt<=pPage->pBt->
e030: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
e040: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
e050: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
e060: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
e070: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
e080: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
e090: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
e0a0: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
e0b0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
e0c0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
e0d0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
e0e0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
e0f0: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
e100: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
e110: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
e120: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
e130: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
e140: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
e150: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
e160: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
e170: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
e180: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e190: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
e1a0: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
e1b0: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
e1c0: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
e1d0: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
e1e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e1f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e200: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
e220: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e230: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e240: 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
e250: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
e260: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e270: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
e280: 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
e290: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e2a0: 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
e2b0: 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
e2c0: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
e2d0: 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
e2e0: 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
e2f0: 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
e300: 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
e310: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
e320: 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
e330: 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
e340: 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
e350: 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
e360: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
e370: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
e380: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
e390: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e3a0: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
e3b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
e3c0: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
e3d0: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
e3e0: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
e3f0: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
e400: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
e410: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
e420: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
e430: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
e440: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
e450: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
e460: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
e470: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
e480: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
e490: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
e4a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e4b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e4c0: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
e4e0: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
e4f0: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
e500: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e510: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
e520: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e530: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
e540: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
e550: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
e560: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
e570: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
e580: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
e590: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
e5a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
e5b0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
e5c0: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
e5d0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
e5e0: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
e5f0: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
e600: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
e610: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
e620: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
e630: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e640: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
e650: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e660: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
e670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e680: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e690: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
e6a0: 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72    nFrag += iStar
e6b0: 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20  t - iPtrEnd;.   
e6c0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
e6d0: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
e6e0: 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b    iStart = iPtr;
e6f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e700: 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74     if( nFrag>dat
e710: 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72  a[hdr+7] ) retur
e720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e730: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
e740: 6f 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  o);.    data[hdr
e750: 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
e760: 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65  }.  x = get2byte
e770: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
e780: 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20    if( iStart<=x 
e790: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ){.    /* The ne
e7a0: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61  w freeblock is a
e7b0: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
e7c0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
e7d0: 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a  ent area,.    **
e7e0: 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20   so just extend 
e7f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
e800: 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61   area rather tha
e810: 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72  n create another
e820: 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  .    ** freelist
e830: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66   entry */.    if
e840: 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50  ( iStart<x || iP
e850: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
e860: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e870: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
e880: 6e 6f 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  no);.    put2byt
e890: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
e8a0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
e8b0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e8c0: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
e8d0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
e8e0: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
e8f0: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
e900: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
e910: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
e920: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
e930: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  }.  if( pPage->p
e940: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
e950: 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29  TS_FAST_SECURE )
e960: 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  {.    /* Overwri
e970: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
e980: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
e990: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
e9a0: 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20  e_delete.    ** 
e9b0: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
e9c0: 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
e9d0: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30  &data[iStart], 0
e9e0: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
e9f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
ea00: 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b  Start], iFreeBlk
ea10: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
ea20: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
ea30: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
ea40: 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69  nFree += iOrigSi
ea50: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
ea60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ea70: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
ea80: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
ea90: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
eaa0: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
eab0: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
eac0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
ead0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
eae0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
eaf0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
eb00: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
eb10: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
eb20: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
eb30: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
eb40: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
eb50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
eb60: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
eb70: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
eb80: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
eb90: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
eba0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
ebb0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
ebc0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
ebd0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
ebe0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
ebf0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
ec00: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
ec10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
ec20: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
ec30: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
ec40: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
ec50: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
ec60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
ec70: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
ec80: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
ec90: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
eca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ecb0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
ecc0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
ecd0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
ece0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
ecf0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
ed00: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
ed10: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
ed20: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
ed30: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
ed40: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50  Page->leaf;.  pP
ed50: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
ed60: 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20   cellSizePtr;.  
ed70: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ed80: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
ed90: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
eda0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
edb0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
edc0: 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33  -OF: R-07291-353
edd0: 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  28 A value of 5 
ede0: 28 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65  (0x05) means the
edf0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
ee00: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c  ** interior tabl
ee10: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
ee20: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
ee30: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
ee40: 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20  INTKEY)==5 );.  
ee50: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ee60: 3a 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20  : R-26900-09176 
ee70: 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30  A value of 13 (0
ee80: 78 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70  x0d) means the p
ee90: 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20  age is a.    ** 
eea0: 6c 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65  leaf table b-tre
eeb0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
eec0: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
eed0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
eee0: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
eef0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
ef00: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
ef10: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
ef20: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
ef30: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
ef40: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
ef50: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
ef60: 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c  CellPtr;.    }el
ef70: 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  se{.      pPage-
ef80: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b  >intKeyLeaf = 0;
ef90: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43  .      pPage->xC
efa0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
efb0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  zePtrNoPayload;.
efc0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
efd0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
efe0: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
eff0: 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  load;.    }.    
f000: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
f010: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
f020: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
f030: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
f040: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
f050: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
f060: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
f070: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f080: 34 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61  43316-37308 A va
f090: 6c 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20  lue of 2 (0x02) 
f0a0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f0b0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f0c0: 72 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65  rior index b-tre
f0d0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f0e0: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
f0f0: 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20  DATA)==2 );.    
f100: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f110: 52 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20  R-59615-42828 A 
f120: 76 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30  value of 10 (0x0
f130: 61 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  a) means the pag
f140: 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65  e is a.    ** le
f150: 61 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  af index b-tree 
f160: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f170: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
f180: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
f190: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
f1a0: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
f1b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
f1c0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
f1d0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
f1f0: 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d  ndex;.    pPage-
f200: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
f210: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
f220: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
f230: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
f240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
f250: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
f260: 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f  7608-56469 Any o
f270: 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  ther value for t
f280: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
f290: 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e  ype is.    ** an
f2a0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72   error. */.    r
f2b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f2c0: 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
f2d0: 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 70 50  >pgno);.  }.  pP
f2e0: 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
f2f0: 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31  load = pBt->max1
f300: 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72  bytePayload;.  r
f310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
f330: 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61  lize the auxilia
f340: 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ry information f
f350: 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e  or a disk block.
f360: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
f370: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
f380: 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74  ss.  If we see t
f390: 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65  hat the page doe
f3a0: 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  s.** not contain
f3b0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64   a well-formed d
f3c0: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68  atabase page, th
f3d0: 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  en return .** SQ
f3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e  LITE_CORRUPT.  N
f3f0: 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72  ote that a retur
f400: 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64  n of SQLITE_OK d
f410: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61  oes not.** guara
f420: 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61  ntee that the pa
f430: 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  ge is well-forme
f440: 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77  d.  It only show
f450: 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69  s that.** we fai
f460: 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e  led to detect an
f470: 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  y corruption..*/
f480: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
f490: 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67  eInitPage(MemPag
f4a0: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
f4b0: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
f4c0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
f4d0: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
f4e0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
f4f0: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
f500: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f510: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
f520: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
f530: 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
f540: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
f550: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
f560: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
f570: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
f580: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
f590: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75  cture */.  int u
f5a0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
f5b0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
f5c0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
f5d0: 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63 65  page */.  u16 ce
f5e0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
f5f0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
f600: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
f610: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
f620: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
f630: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
f640: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
f650: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
f660: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
f670: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
f680: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
f690: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
f6a0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
f6b0: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
f6c0: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
f6d0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
f6e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
f6f0: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
f700: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
f710: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
f720: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
f730: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
f740: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f750: 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b  e->pBt->db!=0 );
f760: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f770: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
f780: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
f790: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f7a0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
f7b0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
f7c0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
f7d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
f7e0: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
f7f0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
f800: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
f810: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
f820: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
f830: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
f840: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
f850: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f860: 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a  ->isInit==0 );..
f870: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
f880: 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  Bt;.  hdr = pPag
f890: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
f8a0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
f8b0: 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ata;.  /* EVIDEN
f8c0: 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30  CE-OF: R-28594-0
f8d0: 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74  2890 The one-byt
f8e0: 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74  e flag at offset
f8f0: 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20   0 indicating.  
f900: 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
f910: 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66  ge type. */.  if
f920: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
f930: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
f940: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f950: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
f960: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
f970: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
f980: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
f990: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
f9a0: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
f9b0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
f9c0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
f9d0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
f9e0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
f9f0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
fa00: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fa10: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
fa20: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
fa30: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
fa40: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
fa50: 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  ze;.  pPage->aDa
fa60: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
fa70: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
fa80: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
fa90: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
faa0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
fab0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
fac0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
fad0: 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ];.  /* EVIDENCE
fae0: 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
faf0: 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
fb00: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
fb10: 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
fb20: 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
fb30: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
fb40: 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
fb50: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
fb60: 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
fb70: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
fb80: 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
fb90: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
fba0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
fbb0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
fbc0: 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
fbd0: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
fbe0: 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
fbf0: 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
fc00: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
fc10: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
fc20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
fc30: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
fc40: 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
fc50: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
fc60: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
fc70: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
fc80: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
fc90: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
fca0: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
fcb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fcc0: 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
fcd0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
fce0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
fcf0: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
fd00: 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45  L(pBt) );.  /* E
fd10: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
fd20: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
fd30: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
fd40: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
fd50: 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62  only.  ** possib
fd60: 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61  le for a root pa
fd70: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ge of a table th
fd80: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  at contains no r
fd90: 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20  ows) then the.  
fda0: 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  ** offset to the
fdb0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fdc0: 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68  ea will equal th
fdd0: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75  e page size minu
fde0: 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73  s the.  ** bytes
fdf0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
fe00: 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ce. */.  assert(
fe10: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
fe20: 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69  || top==usableSi
fe30: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
fe40: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66   );..  /* A malf
fe50: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
fe60: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
fe70: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
fe80: 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  the end.  ** of 
fe90: 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e  page when parsin
fea0: 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a  g a cell.  .  **
feb0: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
fec0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
fed0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
fee0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
fef0: 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73  extends.  ** pas
ff00: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
ff10: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
ff20: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
ff30: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
ff40: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
ff50: 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  t does..  */.  i
ff60: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
ff70: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
ff80: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  ->nCell;.  iCell
ff90: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
ffa0: 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 70 42 74  e - 4;.  if( pBt
ffb0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
ffc0: 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20  LITE_CellSizeCk 
ffd0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fff0: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
10000 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
10010 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20  .    int sz;    
10020 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10030 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
10040 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
10050 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
10060 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10070 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
10080 2b 29 7b 0a 20 20 20 20 20 20 70 63 20 3d 20 67  +){.      pc = g
10090 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
100a0 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
100b0 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74 65 73  i*2]);.      tes
100c0 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
100d0 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 74  First );.      t
100e0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
100f0 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
10100 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
10110 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
10120 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  t ){.        ret
10130 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10140 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
10150 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
10160 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e      sz = pPage->
10170 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
10180 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
10190 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
101a0 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
101b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73  ;.      if( pc+s
101c0 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
101d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
101e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
101f0 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
10200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10210 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
10220 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b  eaf ) iCellLast+
10230 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43  +;.  }  ..  /* C
10240 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
10250 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
10260 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49  he page.  ** EVI
10270 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38  DENCE-OF: R-2358
10280 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d  8-34450 The two-
10290 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
102a0 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74  offset 1 gives t
102b0 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  he.  ** start of
102c0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62   the first freeb
102d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
102e0 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20  , or is zero if 
102f0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
10300 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
10310 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
10320 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
10330 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
10340 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a  dr+7] + top;  /*
10350 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e   Init nFree to n
10360 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65  on-freeblock fre
10370 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28  e space */.  if(
10380 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32   pc>0 ){.    u32
10390 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
103a0 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
103b0 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45  st ){.      /* E
103c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
103d0 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77  530-52930 In a w
103e0 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
103f0 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69  e page, there wi
10400 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  ll.      ** alwa
10410 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  ys be at least o
10420 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74  ne cell before t
10430 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
10440 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
10450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10460 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
10470 61 67 65 2d 3e 70 67 6e 6f 29 3b 20 0a 20 20 20  age->pgno); .   
10480 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20   }.    while( 1 
10490 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  ){.      if( pc>
104a0 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
104b0 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
104c0 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
104d0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
104e0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
104f0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
10500 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
10510 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
10520 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10530 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
10540 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
10550 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
10560 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
10570 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  + size;.      if
10580 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  ( next<=pc+size+
10590 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  3 ) break;.     
105a0 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
105b0 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30  }.    if( next>0
105c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65   ){.      /* Fre
105d0 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73  eblock not in as
105e0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f  cending order */
105f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10600 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
10610 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
10620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63      }.    if( pc
10630 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20  +size>(unsigned 
10640 69 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29  int)usableSize )
10650 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  {.      /* Last 
10660 66 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64  freeblock extend
10670 73 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20  s past page end 
10680 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10690 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
106a0 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
106b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
106c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
106d0 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
106e0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
106f0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
10700 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  rt.  ** of the c
10710 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10720 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
10730 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
10740 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63  ithin.  ** the c
10750 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10760 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
10770 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
10780 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f  able-size.  ** o
10790 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
107a0 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
107b0 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
107c0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a  s check also.  *
107d0 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
107e0 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
107f0 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
10800 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
10810 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61  ent.  ** area, a
10820 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
10830 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
10840 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
10850 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  e..  */.  if( nF
10860 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
10870 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10880 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
10890 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
108a0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
108b0 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
108c0 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
108d0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
108e0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
108f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10900 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10910 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10920 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10930 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10940 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10950 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
10960 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
10970 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
10980 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
10990 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
109a0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
109b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
109c0 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
109d0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
109e0 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
109f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10a00 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10a10 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10a20 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10a40 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
10a50 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
10a60 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
10a70 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
10a80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
10a90 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
10aa0 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
10ab0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ac0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
10ad0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10af0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10b00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10b10 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
10b20 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
10b30 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
10b40 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
10b50 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
10b60 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
10b70 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
10b80 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
10b90 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
10ba0 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
10bb0 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
10bc0 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
10bd0 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
10be0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
10bf0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
10c00 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
10c10 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
10c20 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
10c30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
10c40 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
10c50 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
10c60 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
10c70 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
10c80 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
10c90 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
10ca0 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10cb0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10cc0 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10cd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10ce0 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10cf0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10d00 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10d10 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10d20 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10d30 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10d40 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
10d50 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
10d60 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
10d70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
10d80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
10d90 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
10da0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10db0 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10dc0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10dd0 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10de0 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10df0 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10e00 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10e10 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10e20 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10e30 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10e40 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
10e50 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
10e60 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
10e70 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
10e80 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
10e90 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
10ea0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10eb0 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10ec0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10ed0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10ee0 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10ef0 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10f00 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10f10 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10f20 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10f30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10f40 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
10f50 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
10f60 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
10f70 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
10f80 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
10f90 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
10fa0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10fb0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10fc0 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10fd0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10fe0 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10ff0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
11000 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
11010 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
11020 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
11030 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
11040 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
11050 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
11060 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
11070 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
11080 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11090 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
110a0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
110b0 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
110c0 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
110d0 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
110e0 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
110f0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
11100 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
11110 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
11120 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
11130 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
11140 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
11150 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
11160 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
11170 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
11180 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
11190 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
111a0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
111b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
111c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
111d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
111e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
111f0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
11200 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
11210 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
11220 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
11230 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
11240 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11250 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11260 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11270 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11280 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11290 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
112a0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
112b0 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
112c0 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
112d0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
112e0 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
112f0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
11300 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
11310 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
11320 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
11330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11340 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11350 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11360 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
11370 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
11380 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
11390 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
113a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
113b0 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
113c0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
113d0 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
113e0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
113f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11400 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
11410 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
11420 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
11430 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
11440 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
11450 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
11460 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
11470 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
11480 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
11490 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
114a0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
114b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
114c0 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
114d0 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
114e0 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
114f0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
11500 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
11510 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11520 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11530 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
11540 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
11550 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11560 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
11570 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
11580 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11590 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
115a0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
115b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
115c0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
115d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
115e0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
115f0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
11600 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
11610 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
11620 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
11630 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
11640 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
11650 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
11660 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
11670 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
11680 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
11690 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
116a0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
116b0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
116c0 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
116d0 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
116e0 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
116f0 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
11700 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
11710 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
11720 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
11730 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
11740 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
11750 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
11760 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
11770 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
11780 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
11790 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
117a0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
117b0 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
117c0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
117d0 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
117e0 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
117f0 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
11800 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
11810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
11820 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
11830 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
11840 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
11850 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
11860 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
11870 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11880 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
11890 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
118a0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
118b0 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
118c0 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
118d0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
118e0 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
118f0 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
11900 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
11910 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
11920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
11930 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
11940 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
11970 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
11980 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
11990 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
119a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
119b0 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
119c0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
119d0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
119e0 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
119f0 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
11a00 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
11a10 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
11a40 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
11a50 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
11a60 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
11a70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11a80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11a90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11aa0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11ab0 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
11ac0 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
11ad0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11ae0 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d  bReadOnly==pCur-
11af0 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 29  >curPagerFlags )
11b00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11b10 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  ==0 || pCur->iPa
11b20 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  ge>0 );..  if( p
11b30 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
11b40 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
11b50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
11b60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
11b70 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
11b80 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63  _error;.  }.  rc
11b90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
11ba0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
11bb0 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
11bc0 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f  &pDbPage, bReadO
11bd0 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nly);.  if( rc )
11be0 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  {.    goto getAn
11bf0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11c00 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
11c10 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
11c20 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11c30 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
11c40 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11c50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65  t==0 ){.    btre
11c60 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
11c70 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
11c80 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  Bt);.    rc = bt
11c90 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
11ca0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11cb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11cc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11cd0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
11ce0 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11cf0 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
11d00 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
11d10 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
11d20 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
11d30 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44  t( (*ppPage)->aD
11d40 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
11d50 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
11d60 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  ) );..  /* If ob
11d70 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
11d80 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
11d90 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
11da0 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
11db0 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
11dc0 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
11dd0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
11de0 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67  pCur && ((*ppPag
11df0 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28  e)->nCell<1 || (
11e00 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79  *ppPage)->intKey
11e10 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  !=pCur->curIntKe
11e20 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  y) ){.    rc = S
11e30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
11e40 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65  NO(pgno);.    re
11e50 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11e60 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
11e70 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11e80 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
11e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
11ea0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11eb0 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
11ec0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
11ed0 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  -;.    pCur->pPa
11ee0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
11ef0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
11f00 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
11f10 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pgno==0 );.  ass
11f20 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20  ert( pgno!=0 || 
11f30 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
11f40 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  PT );.  return r
11f50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
11f60 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20  ase a MemPage.  
11f70 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63  This should be c
11f80 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
11f90 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c  ach prior.** cal
11fa0 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  l to btreeGetPag
11fb0 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69  e..**.** Page1 i
11fc0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
11fd0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c   and must be rel
11fe0 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65  eased using rele
11ff0 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f  asePageOne()..*/
12000 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
12010 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
12020 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
12030 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12040 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
12050 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
12060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
12070 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
12080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12090 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
120a0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
120b0 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
120c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
120d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
120e0 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
120f0 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
12100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12110 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12120 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
12130 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
12140 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
12150 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12160 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
12170 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
12180 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
12190 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
121a0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
121b0 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
121c0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f  oid releasePageO
121d0 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ne(MemPage *pPag
121e0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
121f0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
12200 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
12210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12220 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
12230 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
12240 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
12250 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12260 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
12270 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
12280 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
12290 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
122a0 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
122b0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
122c0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
122d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
122e0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
122f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12300 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
12310 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d  efPageOne(pPage-
12320 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  >pDbPage);.}../*
12330 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65  .** Get an unuse
12340 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  d page..**.** Th
12350 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69  is works just li
12360 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ke btreeGetPage(
12370 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74  ) with the addit
12380 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ion:.**.**   *  
12390 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  If the page is a
123a0 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f  lready in use fo
123b0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
123c0 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c  pose, immediatel
123d0 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73  y.**      releas
123e0 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  e it and return 
123f0 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50  an SQLITE_CURRUP
12400 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20  T error..**   * 
12410 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69   Make sure the i
12420 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c  sInit flag is cl
12430 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ear.*/.static in
12440 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  t btreeGetUnused
12450 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
12460 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
12470 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
12480 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
12490 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
124a0 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
124b0 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
124c0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
124d0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
124e0 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
124f0 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
12500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12510 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
12520 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
12530 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
12540 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47   int rc = btreeG
12550 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
12560 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29  , ppPage, flags)
12570 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
12590 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
125a0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
125b0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
125c0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
125d0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
125e0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
125f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12600 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12610 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
12620 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
12630 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
12640 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
12650 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12660 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67  }.../*.** During
12670 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65   a rollback, whe
12680 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f  n the pager relo
12690 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ads information 
126a0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a  into the cache.*
126b0 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61  * so that the ca
126c0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
126d0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
126e0 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61  state at the sta
126f0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61  rt of.** the tra
12700 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61  nsaction, for ea
12710 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64  ch page restored
12720 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12730 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
12740 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64  his routine need
12750 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65  s to reset the e
12760 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f  xtra data sectio
12770 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  n at the end of 
12780 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61  the.** page to a
12790 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
127a0 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  stored data..*/.
127b0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
127c0 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70  Reinit(DbPage *p
127d0 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Data){.  MemPage
127e0 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65   *pPage;.  pPage
127f0 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71   = (MemPage *)sq
12800 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12810 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  ra(pData);.  ass
12820 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12830 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
12840 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20  ata)>0 );.  if( 
12850 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
12860 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
12870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12880 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
12890 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  x) );.    pPage-
128a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
128b0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
128c0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44  rPageRefcount(pD
128d0 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  ata)>1 ){.      
128e0 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e  /* pPage might n
128f0 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61  ot be a btree pa
12900 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65  ge;  it might be
12910 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
12920 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74  e.      ** or pt
12930 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66  rmap page or a f
12940 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68  ree page.  In th
12950 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66  ose cases, the f
12960 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a  ollowing.      *
12970 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49  * call to btreeI
12980 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c  nitPage() will l
12990 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c  ikely return SQL
129a0 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20  ITE_CORRUPT..   
129b0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72     ** But no har
129c0 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69  m is done by thi
129d0 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65  s.  And it is ve
129e0 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ry important tha
129f0 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65  t.      ** btree
12a00 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61  InitPage() be ca
12a10 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74  lled on every bt
12a20 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d  ree page so we m
12a30 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ake.      ** the
12a40 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20   call for every 
12a50 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20  page that comes 
12a60 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e  in for re-initin
12a70 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65  g. */.      btre
12a80 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
12a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12aa0 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
12ab0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72  busy handler for
12ac0 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61   a btree..*/.sta
12ad0 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76  tic int btreeInv
12ae0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76  okeBusyHandler(v
12af0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74  oid *pArg){.  Bt
12b00 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42  Shared *pBt = (B
12b10 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20  tShared*)pArg;. 
12b20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62   assert( pBt->db
12b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12b50 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  (pBt->db->mutex)
12b60 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
12b70 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
12b80 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e  ndler(&pBt->db->
12b90 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a  busyHandler);.}.
12ba0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
12bb0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
12bc0 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
12bd0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12bf0 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12c00 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e   NULL.** then an
12c10 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
12c20 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ase is created. 
12c30 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   The ephemeral d
12c40 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a  atabase might.**
12c50 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20   be exclusively 
12c60 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74  in memory, or it
12c70 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73   might use a dis
12c80 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63  k-based memory c
12c90 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20  ache..** Either 
12ca0 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72  way, the ephemer
12cb0 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  al database will
12cc0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
12cd0 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68  y deleted .** wh
12ce0 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
12cf0 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
12d00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12d10 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12d20 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
12d30 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
12d40 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
12d50 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
12d60 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
12d70 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
12d80 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22  *.** The "flags"
12d90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
12da0 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67  bitmask that mig
12db0 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20  ht contain bits 
12dc0 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d  like.** BTREE_OM
12dd0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f  IT_JOURNAL and/o
12de0 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a  r BTREE_MEMORY..
12df0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
12e00 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
12e10 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73   opened in the s
12e20 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
12e30 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77  nection.** and w
12e40 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20  e are in shared 
12e50 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
12e60 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66   the open will f
12e70 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  ail with an.** S
12e80 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12e90 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e   error.  We cann
12ea0 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20  ot allow two or 
12eb0 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a  more BtShared.**
12ec0 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
12ed0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
12ee0 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64  nnection since d
12ef0 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61  oing so will lea
12f00 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73  d.** to problems
12f10 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   with locking..*
12f20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12f30 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  eeOpen(.  sqlite
12f40 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12f50 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
12f60 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20  for this b-tree 
12f70 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12f80 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
12f90 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
12fa0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
12fb0 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
12fc0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12fe0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
12ff0 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
13000 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
13010 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
13020 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
13030 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
13040 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
13050 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13060 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
13070 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
13080 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
13090 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
130a0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
130b0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42  Open() */.){.  B
130c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
130d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
130e0 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
130f0 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
13100 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
13110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13120 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
13130 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
13140 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
13150 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
13160 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
13170 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
13180 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
13190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
131a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
131b0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
131c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
131d0 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
13200 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
13210 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
13220 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
13230 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
13240 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
13250 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72  tent */..  /* Tr
13260 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e  ue if opening an
13270 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70   ephemeral, temp
13280 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a  orary database *
13290 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  /.  const int is
132a0 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61  TempDb = zFilena
132b0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
132c0 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  me[0]==0;..  /* 
132d0 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
132e0 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
132f0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
13300 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
13310 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
13320 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
13330 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  base..  */.#ifde
13340 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
13350 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
13360 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
13370 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e  #else.  const in
13380 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69  t isMemdb = (zFi
13390 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70  lename && strcmp
133a0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
133b0 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20  mory:")==0).    
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20     || (isTempDb 
133e0 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  && sqlite3TempIn
133f0 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20  Memory(db)).    
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13410 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20     || (vfsFlags 
13420 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  & SQLITE_OPEN_ME
13430 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
13440 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
13450 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13460 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Vfs!=0 );.  asse
13470 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13480 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
13490 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
134a0 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61  flags&0xff)==fla
134b0 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73  gs );   /* flags
134c0 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a   fit in 8 bits *
134d0 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42  /..  /* Only a B
134e0 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
134f0 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45  base can be BTRE
13500 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20  E_UNORDERED */. 
13510 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
13520 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  & BTREE_UNORDERE
13530 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  D)==0 || (flags 
13540 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21  & BTREE_SINGLE)!
13550 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54  =0 );..  /* A BT
13560 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
13570 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ase is always a 
13580 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72  temporary and/or
13590 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20   ephemeral */.  
135a0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
135b0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d   BTREE_SINGLE)==
135c0 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b  0 || isTempDb );
135d0 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20  ..  if( isMemdb 
135e0 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
135f0 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  BTREE_MEMORY;.  
13600 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67  }.  if( (vfsFlag
13610 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13620 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28  MAIN_DB)!=0 && (
13630 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d  isMemdb || isTem
13640 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46  pDb) ){.    vfsF
13650 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
13660 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
13670 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
13680 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
13690 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
136a0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
136b0 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
136c0 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
136d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
136e0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  BKPT;.  }.  p->i
136f0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
13700 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
13710 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
13720 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13730 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
13740 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
13750 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
13760 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
13770 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13780 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
13790 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
137a0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
137b0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
137c0 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
137d0 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
137e0 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
137f0 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
13800 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
13810 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
13820 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
13830 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
13840 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
13850 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
13860 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
13870 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
13880 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
13890 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
138a0 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
138b0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
138c0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
138d0 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69  name)+1;.      i
138e0 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
138f0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
13900 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
13910 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
13920 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13930 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61  (MAX(nFullPathna
13940 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  me,nFilename));.
13950 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
13960 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
13970 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
13980 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ..      p->shara
13990 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ble = 1;.      i
139a0 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
139b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
139c0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
139d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
139e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
139f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
13a00 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
13a10 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
13a20 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
13a30 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
13a40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13a60 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
13a70 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
13a80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
13ab0 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
13ac0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
13ad0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
13ae0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
13af0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
13b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13b10 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
13b20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13b40 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
13b50 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
13b60 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
13b70 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13b80 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
13b90 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
13ba0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
13bb0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
13bc0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
13bd0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13be0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13bf0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
13c00 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13c10 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13c20 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
13c30 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
13c40 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
13c50 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
13c60 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
13c70 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
13c80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13c90 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
13ca0 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
13cb0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
13cc0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
13cd0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
13ce0 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
13cf0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
13d00 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
13d10 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
13d20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
13d30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
13d40 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
13d50 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
13d60 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
13d70 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
13d80 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
13d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13da0 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
13db0 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
13dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13dd0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13de0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
13df0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
13e00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13e10 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
13e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
13e40 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
13e50 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13e60 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
13e70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13e80 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13e90 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
13ea0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
13eb0 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
13ec0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
13ed0 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
13ee0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13f10 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
13f20 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
13f30 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13f40 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
13f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
13f60 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
13f70 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
13f80 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
13f90 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
13fa0 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
13fb0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
13fc0 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
13fd0 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
13fe0 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
13ff0 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
14000 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
14010 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
14020 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
14030 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
14040 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
14050 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
14060 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
14070 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
14080 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
14090 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
140a0 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
140b0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
140c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
140d0 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
140e0 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
140f0 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
14100 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
14110 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
14120 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
14130 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
14140 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
14150 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
14160 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
14170 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
14180 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
14190 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
141a0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
141b0 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
141c0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
141d0 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
141e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
141f0 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
14200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14210 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
14220 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
14230 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
14240 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
14250 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
14260 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14270 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14280 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
14290 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
142a0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
142b0 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
142c0 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
142d0 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142f0 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50       sizeof(MemP
14300 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73  age), flags, vfs
14310 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
14320 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
14330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14340 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
14350 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
14360 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
14370 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
14380 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
14390 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
143a0 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
143b0 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
143c0 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
143d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
143e0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
143f0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
14400 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
14410 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
14420 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
14430 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
14440 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
14450 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
14460 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
14470 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
14480 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
14490 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
144a0 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
144b0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
144c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
144d0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
144e0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
144f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14500 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
14510 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14520 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
14530 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ).    pBt->btsFl
14540 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
14550 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20  E_DELETE;.#elif 
14560 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46  defined(SQLITE_F
14570 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  AST_SECURE_DELET
14580 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  E).    pBt->btsF
14590 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52  lags |= BTS_OVER
145a0 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  WRITE;.#endif.  
145b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
145c0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
145d0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
145e0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
145f0 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
14600 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
14610 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
14620 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
14630 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
14640 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
14650 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
14660 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
14670 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
14680 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
14690 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
146a0 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
146b0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
146c0 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
146d0 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
146e0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
146f0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
14700 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
14710 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
14720 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
14730 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
14740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14750 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
14760 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
14770 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
14780 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
14790 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
147a0 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
147b0 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
147c0 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
147d0 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
147e0 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
147f0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
14800 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
14810 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
14820 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
14830 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
14840 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
14850 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
14860 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
14870 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
14880 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
14890 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
148a0 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
148b0 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
148c0 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
148d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
148e0 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
148f0 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
14900 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
14910 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
14920 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
14930 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
14940 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
14950 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14960 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
14970 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
14980 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
14990 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
149a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45  else{.      /* E
149b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
149c0 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
149d0 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
149e0 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
149f0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
14a00 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
14a10 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
14a20 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
14a30 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20  fset of 20.     
14a40 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
14a50 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
14a60 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73  r. */.      nRes
14a70 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
14a80 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
14a90 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14aa0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
14ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ac0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14ad0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
14ae0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
14af0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
14b00 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
14b10 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
14b20 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
14b30 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
14b40 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
14b50 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
14b60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
14b70 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
14b80 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
14b90 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
14ba0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
14bb0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14bc0 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
14bd0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
14be0 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
14bf0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
14c00 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
14c10 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
14c20 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
14c30 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
14c40 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
14c50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14c60 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
14c70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14c80 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
14c90 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
14ca0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
14cb0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
14cc0 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
14cd0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42  s..    */.    pB
14ce0 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
14cf0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
14d00 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
14d10 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
14d20 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
14d30 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58  d; ).      MUTEX
14d40 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
14d50 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
14d60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14d70 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
14d80 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
14d90 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
14da0 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
14db0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
14dc0 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
14dd0 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
14de0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14df0 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
14e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
14e10 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
14e20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
14e30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
14e40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
14e50 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
14e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14e70 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14e80 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
14e90 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14ea0 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
14eb0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14ec0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14ed0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
14ee0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14ef0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14f00 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
14f10 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14f20 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14f30 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
14f40 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
14f50 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14f60 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
14f70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14f80 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
14f90 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
14fa0 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
14fb0 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
14fc0 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
14fd0 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
14fe0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
14ff0 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
15000 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
15010 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
15020 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
15030 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
15040 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
15050 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
15060 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15070 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
15080 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
15090 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
150a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
150b0 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
150c0 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
150d0 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
150e0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
150f0 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
15100 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
15110 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
15120 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75   (uptr)p->pBt<(u
15130 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b  ptr)pSib->pBt ){
15140 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
15150 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
15160 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
15170 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
15180 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
15190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
151a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
151b0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75  Sib->pNext && (u
151c0 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d  ptr)pSib->pNext-
151d0 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42  >pBt<(uptr)p->pB
151e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
151f0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
15200 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
15210 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
15220 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
15230 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
15240 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
15250 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
15260 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
15270 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
15280 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
15290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
152a0 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
152b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
152c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
152d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
152e0 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
152f0 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
15300 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
15310 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15320 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
15330 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
15340 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
15350 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b  pBt->pPager, 0);
15360 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15370 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
15380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
15390 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
153a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
153b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
153c0 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  pFile;..    /* I
153d0 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
153e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
153f0 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
15400 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
15410 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
15420 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
15430 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
15440 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
15450 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
15460 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
15470 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
15480 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
15490 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
154a0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
154b0 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
154c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
154d0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
154e0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
154f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
15500 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
15510 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71  ..    pFile = sq
15520 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
15530 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
15540 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
15550 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71  hods ){.      sq
15560 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
15570 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51  olHint(pFile, SQ
15580 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20  LITE_FCNTL_PDB, 
15590 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29  (void*)&pBt->db)
155a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
155b0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
155c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
155d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
155e0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
155f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15600 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
15610 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
15620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
15630 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65  qlite3BtreeConne
15640 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74  ctionCount(*ppBt
15650 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75  ree)>0 );.  retu
15660 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15670 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
15680 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
15690 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
156a0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
156b0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
156c0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
156d0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
156e0 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
156f0 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
15700 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15710 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
15720 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
15730 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
15740 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
15750 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
15760 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
15770 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
15780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15790 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
157a0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
157b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
157c0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
157d0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
157e0 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
157f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15800 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
15810 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15820 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
15830 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
15840 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15850 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15860 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
15870 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
15880 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
15890 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
158a0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
158b0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
158c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
158d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
158e0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
158f0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15900 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15910 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
15920 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
15930 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
15940 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15950 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15960 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
15970 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
15980 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
15990 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
159a0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
159b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
159c0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
159d0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
159e0 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
159f0 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
15a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
15a10 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15a20 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
15a30 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
15a40 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
15a50 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
15a60 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
15a70 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
15a80 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
15a90 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
15aa0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
15ab0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
15ac0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
15ad0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
15ae0 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
15af0 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
15b00 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
15b10 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
15b20 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
15b30 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
15b40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
15b50 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
15b60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15b70 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
15b80 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
15b90 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
15ba0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
15bb0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
15bc0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
15bd0 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
15be0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
15bf0 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
15c00 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
15c10 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
15c20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
15c30 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
15c40 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
15c50 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
15c60 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
15c70 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
15c80 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
15c90 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
15ca0 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
15cb0 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
15cc0 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
15cd0 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
15ce0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
15cf0 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
15d00 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
15d10 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
15d20 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
15d30 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
15d40 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
15d50 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
15d60 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
15d70 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
15d80 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
15d90 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
15da0 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
15db0 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
15dc0 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
15dd0 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
15de0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
15df0 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
15e00 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
15e10 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
15e20 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
15e30 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
15e40 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
15e50 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
15e60 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
15e70 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
15e80 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
15e90 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
15ea0 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
15eb0 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
15ec0 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
15ed0 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
15ee0 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
15ef0 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
15f00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
15f10 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
15f20 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15f30 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
15f40 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
15f50 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
15f60 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
15f70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
15f80 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
15f90 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
15fa0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15fb0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
15fc0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
15fd0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
15fe0 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
15ff0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16000 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16010 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
16020 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
16030 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
16040 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16050 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
16060 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
16070 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
16080 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
16090 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
160a0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
160b0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
160c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
160d0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
160e0 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
160f0 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
16100 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
16110 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
16120 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16130 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16140 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16150 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16160 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
16170 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
16180 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
16190 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
161a0 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
161b0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
161c0 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
161d0 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
161e0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
161f0 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
16200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
16210 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
16220 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
16230 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
16240 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
16250 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
16260 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
16270 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
16280 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
16290 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
162a0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
162b0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
162c0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
162d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
162e0 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
162f0 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
16300 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
16310 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
16320 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
16330 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
16340 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
16350 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
16360 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
16370 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
16380 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
16390 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
163a0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
163b0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
163c0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
163d0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
163e0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
163f0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
16400 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
16410 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
16420 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
16430 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
16440 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
16450 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
16460 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
16470 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
16480 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
16490 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
164a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
164b0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
164c0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
164d0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
164e0 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20  er, p->db);.    
164f0 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
16500 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
16510 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
16520 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
16530 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
16540 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
16550 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53  bFree(0, pBt->pS
16560 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
16570 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
16580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16590 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
165a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
165b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
165c0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
165d0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
165e0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
165f0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
16600 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
16610 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
16620 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
16630 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
16640 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
16650 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
16660 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
16670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16680 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
16690 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f  e "soft" limit o
166a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
166b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
166c0 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e  he..** Unused an
166d0 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67  d unmodified pag
166e0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63  es will be recyc
166f0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  led when the num
16700 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20  ber of.** pages 
16710 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78 63  in the cache exc
16720 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c  eeds this soft l
16730 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20 73  imit.  But the s
16740 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ize of the.** ca
16750 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  che is allowed t
16760 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68  o grow larger th
16770 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66  an this limit if
16780 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
16790 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20 70  dirty pages or p
167a0 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63  ages still in ac
167b0 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  tive use..*/.int
167c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
167d0 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
167e0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
167f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16800 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16810 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16820 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16830 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16840 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16850 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
16860 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
16870 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
16880 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16890 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
168a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
168b0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
168c0 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20  e "spill" limit 
168d0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
168e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
168f0 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e  che..** If the n
16900 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 65  umber of pages e
16910 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69  xceeds this limi
16920 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74 65  t during a write
16930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
16940 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68 74   the pager might
16950 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69   attempt to "spi
16960 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68 65  ll" pages to the
16970 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69   journal early i
16980 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72  n.** order to fr
16990 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  ee up memory..**
169a0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
169b0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63 75  turned is the cu
169c0 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
169d0 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61  .  If zero is pa
169e0 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72  ssed.** as an ar
169f0 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67  gument, no chang
16a00 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
16a10 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65  he spill size se
16a20 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69  tting, so.** usi
16a30 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69  ng mxPage of 0 i
16a40 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72 79  s a way to query
16a50 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
16a60 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20  ll size..*/.int 
16a70 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
16a80 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a  pillSize(Btree *
16a90 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
16aa0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
16ab0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
16ac0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73  res;.  assert( s
16ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16ae0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
16af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16b00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73  eEnter(p);.  res
16b10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
16b20 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d  etSpillsize(pBt-
16b30 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
16b40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16b50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16b60 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53  rn res;.}..#if S
16b70 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
16b80 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
16b90 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
16ba0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
16bb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16bc0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
16bd0 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
16be0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16bf0 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
16c00 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
16c10 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
16c20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16c30 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16c40 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16c50 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16c60 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16c70 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16c90 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
16ca0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
16cb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16cc0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16ce0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
16cf0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
16d00 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
16d10 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
16d20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
16d30 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
16d40 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
16d50 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
16d60 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
16d70 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
16d80 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
16d90 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
16da0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
16db0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
16dc0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
16dd0 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
16de0 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
16df0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
16e00 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
16e10 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
16e20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
16e30 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
16e40 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
16e50 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
16e60 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
16e70 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
16e80 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
16e90 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
16ea0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
16eb0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
16ec0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16ed0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
16ee0 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
16ef0 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
16f00 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16f20 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
16f30 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
16f40 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
16f50 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
16f60 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
16f70 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
16f80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16f90 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
16fa0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16fb0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16fc0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16fd0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16fe0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
16ff0 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
17000 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
17010 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17020 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
17030 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
17040 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17050 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
17060 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
17070 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
17080 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
17090 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
170a0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
170b0 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
170c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
170d0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
170e0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
170f0 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
17100 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
17110 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
17120 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
17130 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
17140 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
17150 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
17160 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
17170 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
17180 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
17190 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
171a0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
171b0 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
171c0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
171d0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
171e0 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
171f0 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
17200 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
17210 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
17220 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
17230 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
17240 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
17250 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
17260 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
17270 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
17280 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
17290 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
172a0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
172b0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
172c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
172d0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
172e0 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
172f0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
17300 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
17310 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
17320 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
17330 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
17340 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
17350 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
17360 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
17370 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
17380 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17390 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
173a0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
173b0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
173c0 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
173d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
173e0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
173f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17400 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17410 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
17420 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
17430 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17440 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
17450 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
17460 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
17470 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
17480 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
17490 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
174a0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
174b0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
174c0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
174d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
174e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
174f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
17500 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
17510 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
17520 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
17530 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
17540 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
17550 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
17560 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
17570 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
17580 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
17590 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
175a0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
175b0 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
175c0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
175d0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
175e0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
175f0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
17600 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
17610 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
17620 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
17630 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
17640 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
17650 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
17660 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17670 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
17680 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
17690 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
176a0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
176b0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
176c0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
176d0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
176e0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
176f0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
17700 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
17710 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17730 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
17740 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
17750 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
17760 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
17770 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
17780 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
17790 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
177a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
177b0 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
177c0 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
177d0 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
177e0 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
177f0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
17800 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
17810 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
17820 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
17830 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
17840 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
17850 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
17860 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
17870 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
17880 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
17890 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
178a0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
178b0 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
178c0 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
178d0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
178e0 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
178f0 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
17900 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
17910 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
17920 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
17930 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
17940 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
17950 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
17960 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
17970 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
17980 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
17990 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
179a0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
179b0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
179c0 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
179d0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
179e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
179f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
17a00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
17a10 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
17a20 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
17a30 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
17a40 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
17a50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17a60 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
17a70 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
17a80 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
17a90 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
17aa0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
17ab0 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
17ac0 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
17ad0 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
17ae0 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
17af0 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
17b00 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
17b10 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
17b20 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
17b30 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
17b40 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
17b50 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
17b60 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
17b70 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
17b80 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
17b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17ba0 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
17bb0 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
17bc0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
17bd0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17be0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
17bf0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
17c00 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
17c10 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
17c20 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
17c30 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17c40 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
17c50 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
17c60 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
17c70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17c80 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
17c90 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
17ca0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
17cb0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
17cc0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
17cd0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
17ce0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
17cf0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
17d00 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
17d10 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
17d20 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
17d30 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
17d40 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
17d50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d60 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
17d70 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
17d80 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
17d90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17da0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
17db0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
17dc0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
17dd0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
17de0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17df0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
17e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
17e10 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
17e20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
17e30 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
17e40 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a  ERWRITE flags:.*
17e50 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  *.**    newFlag=
17e60 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20 42 54  =0       Both BT
17e70 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
17e80 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
17e90 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  E are cleared.**
17ea0 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20      newFlag==1  
17eb0 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
17ec0 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42  DELETE set and B
17ed0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
17ee0 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
17ef0 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42  wFlag==2       B
17f00 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17f10 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53   cleared and BTS
17f20 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 73 65  _OVERWRITE is se
17f30 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  t.**    newFlag=
17f40 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e  =(-1)    No chan
17f50 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ges.**.** This r
17f60 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
17f70 20 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61   query if newFla
17f80 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  g is less than z
17f90 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ero.**.** With B
17fa0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74  TS_OVERWRITE set
17fb0 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  , deleted conten
17fc0 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  t is overwritten
17fd0 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a   by zeros, but.*
17fe0 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20  * freelist leaf 
17ff0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72  pages are not wr
18000 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
18010 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 75  e database.  Thu
18020 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c  s in-page.** del
18030 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
18040 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72 65  cleared, but fre
18050 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f  elist deleted co
18060 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a  ntent is not..**
18070 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43  .** With BTS_SEC
18080 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72  URE_DELETE, oper
18090 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54  ation is like BT
180a0 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74 68  S_OVERWRITE with
180b0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a   the addition.**
180c0 20 74 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c   that freelist l
180d0 65 61 66 20 70 61 67 65 73 20 61 72 65 20 77 72  eaf pages are wr
180e0 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
180f0 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e  the database, in
18100 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20  creasing.** the 
18110 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49  amount of disk I
18120 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  /O..*/.int sqlit
18130 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
18140 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
18150 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
18160 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
18170 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
18180 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18190 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54  p);.  assert( BT
181a0 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53  S_OVERWRITE==BTS
181b0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32  _SECURE_DELETE*2
181c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54   );.  assert( BT
181d0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28  S_FAST_SECURE==(
181e0 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54  BTS_OVERWRITE|BT
181f0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
18200 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61   );.  if( newFla
18210 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
18220 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
18230 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45  ~BTS_FAST_SECURE
18240 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  ;.    p->pBt->bt
18250 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
18260 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46  CURE_DELETE*newF
18270 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28  lag;.  }.  b = (
18280 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18290 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
182a0 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44  RE)/BTS_SECURE_D
182b0 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33  ELETE;.  sqlite3
182c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
182d0 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
182e0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
182f0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
18300 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
18310 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
18320 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
18330 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
18340 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
18350 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
18360 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
18370 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
18380 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
18390 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
183a0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
183b0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
183c0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
183d0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
183e0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
183f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
18400 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18410 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
18420 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
18430 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18440 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
18450 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18460 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
18470 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
18480 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18490 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
184a0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
184b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
184c0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
184d0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
184e0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
184f0 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
18500 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
18510 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
18520 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18530 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18540 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
18550 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
18560 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
18570 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
18580 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18590 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
185a0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
185b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
185c0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
185d0 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
185e0 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
185f0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
18600 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
18610 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
18620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18630 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
18640 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
18650 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18660 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
18670 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
18680 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
18690 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
186a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
186b0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
186c0 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
186d0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
186e0 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
186f0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
18700 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
18710 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
18720 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
18730 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
18740 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18750 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18760 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
18770 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
18780 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61 66 65  not set the safe
18790 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69  ty-level for thi
187a0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
187b0 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22  ction.** using "
187c0 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
187d0 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20  us", and if the 
187e0 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20  safety-level is 
187f0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73  not already.** s
18800 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
18810 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
18820 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73  unction as the s
18830 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
18840 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a  .** set it so..*
18850 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  /.#if SQLITE_DEF
18860 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18870 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
18880 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
18890 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e   \.    && !defin
188a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
188b0 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AL).static void 
188c0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
188d0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
188e0 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
188f0 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
18900 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
18910 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
18920 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
18930 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
18940 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
18950 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
18960 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
18970 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
18980 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
18990 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
189a0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
189b0 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
189c0 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
189d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
189e0 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
189f0 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
18a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18a10 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
18a20 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
18a30 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18a40 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18a50 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18a60 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
18a70 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18a80 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
18a90 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
18aa0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
18ab0 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
18ac0 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
18ad0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
18ae0 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
18af0 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
18b00 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
18b10 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
18b20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
18b30 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
18b40 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
18b50 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
18b60 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
18b70 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
18b80 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
18b90 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
18ba0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
18bb0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
18bc0 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
18bd0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
18be0 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
18bf0 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
18c00 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
18c10 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
18c20 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
18c30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18c40 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
18c50 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
18c60 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
18c70 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
18c80 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
18c90 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
18ca0 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
18cb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18cc0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18cd0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
18ce0 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
18cf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d00 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18d10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18d20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
18d30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18d40 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
18d50 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
18d60 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
18d70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18d80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18d90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
18da0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
18db0 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
18dc0 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
18dd0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
18de0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18df0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18e00 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
18e10 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
18e20 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
18e30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
18e50 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
18e60 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
18e70 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
18e80 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
18e90 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
18ea0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
18eb0 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
18ec0 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
18ed0 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
18ee0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
18ef0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18f00 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
18f10 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
18f20 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
18f30 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
18f40 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
18f50 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
18f60 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
18f70 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
18f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
18f90 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
18fa0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
18fb0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
18fc0 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
18fd0 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
18fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
18ff0 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  DB;.    /* EVIDE
19000 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d  NCE-OF: R-43737-
19010 33 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69  39999 Every vali
19020 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
19030 65 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20  e file begins.  
19040 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f    ** with the fo
19050 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73  llowing 16 bytes
19060 20 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31   (in hex): 53 51
19070 20 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20   4c 69 74 65 20 
19080 36 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20  66 6f 72 6d.    
19090 2a 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30  ** 61 74 20 33 0
190a0 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65  0. */.    if( me
190b0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
190c0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
190d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
190e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
190f0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
19100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
19110 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
19120 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
19130 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
19140 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
19150 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
19160 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
19170 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19180 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65  failed;.    }.#e
19190 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65  lse.    if( page
191a0 31 5b 31 38 5d 3e 33 20 29 7b 0a 20 20 20 20 20  1[18]>3 ){.     
191b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
191c0 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
191d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
191e0 61 67 65 31 5b 31 39 5d 3e 33 20 29 7b 0a 20 20  age1[19]>3 ){.  
191f0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19200 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19210 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
19220 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
19230 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
19240 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
19250 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
19260 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
19270 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
19280 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
19290 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
192a0 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
192b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
192c0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
192d0 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
192e0 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
192f0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
19300 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
19310 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
19320 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
19330 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
19340 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
19350 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
19360 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
19370 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
19380 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
19390 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
193a0 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
193b0 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
193c0 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
193d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
193e0 61 67 65 31 5b 31 39 5d 3e 3d 32 20 26 26 20 28  age1[19]>=2 && (
193f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19400 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29  BTS_NO_WAL)==0 )
19410 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70  {.      int isOp
19420 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  en = 0;.      rc
19430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
19440 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  penWal(pBt->pPag
19450 65 72 2c 20 28 70 61 67 65 31 5b 31 39 5d 3d 3d  er, (page1[19]==
19460 33 29 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20  3), &isOpen);.  
19470 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19490 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
194a0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d  _failed;.      }
194b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65  else{.        se
194c0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
194d0 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46  (pBt, SQLITE_DEF
194e0 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f  AULT_WAL_SYNCHRO
194f0 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20  NOUS+1);.       
19500 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
19510 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
19520 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
19530 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  1);.          re
19540 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19560 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
19570 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
19580 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74  }else{.      set
19590 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
195a0 70 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  pBt, SQLITE_DEFA
195b0 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b  ULT_SYNCHRONOUS+
195c0 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
195d0 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
195e0 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
195f0 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
19600 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
19610 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
19620 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
19630 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
19640 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
19650 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
19660 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
19670 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
19680 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
19690 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
196a0 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
196b0 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
196c0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
196d0 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
196e0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
196f0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
19700 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
19710 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
19720 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19730 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19740 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
19750 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
19760 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
19770 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
19780 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
19790 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
197a0 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
197b0 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
197c0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
197d0 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
197e0 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
197f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19800 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
19810 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
19820 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
19830 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
19840 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19850 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
19860 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
19870 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
19880 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
19890 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
198a0 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
198b0 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
198c0 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
198d0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
198e0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
198f0 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
19900 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
19910 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
19920 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
19930 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
19940 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
19950 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
19960 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19970 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
19980 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
19990 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
199a0 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
199b0 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
199c0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
199d0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
199e0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
199f0 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
19a00 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
19a10 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
19a20 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
19a30 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
19a40 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
19a50 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
19a60 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
19a70 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
19a80 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
19a90 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
19aa0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
19ab0 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
19ac0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19ad0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
19ae0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
19af0 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
19b00 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
19b10 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
19b20 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
19b30 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
19b40 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
19b50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19b60 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
19b70 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
19b80 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
19b90 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
19ba0 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
19bb0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
19bc0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
19bd0 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
19be0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
19bf0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
19c00 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
19c10 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
19c20 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
19c30 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
19c40 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
19c50 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
19c60 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
19c70 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
19c80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19c90 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
19ca0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
19cb0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
19cc0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
19cd0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
19ce0 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53  .      freeTempS
19cf0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20  pace(pBt);.     
19d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19d10 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
19d20 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
19d30 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
19d60 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a  geSize-usableSiz
19d70 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
19d80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
19d90 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  f( (pBt->db->fla
19da0 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
19db0 65 53 63 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e  eSchema)==0 && n
19dc0 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29  Page>nPageFile )
19dd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
19de0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19df0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
19e00 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19e10 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49      }.    /* EVI
19e20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31  DENCE-OF: R-2831
19e30 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c  2-64704 However,
19e40 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65   the usable size
19e50 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
19e60 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73  to.    ** be les
19e70 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f  s than 480. In o
19e80 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74  ther words, if t
19e90 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
19ea0 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  512, then the.  
19eb0 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70    ** reserved sp
19ec0 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20  ace size cannot 
19ed0 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20  exceed 32. */.  
19ee0 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
19ef0 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
19f00 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19f10 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19f20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
19f30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
19f40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
19f50 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
19f60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19f70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
19f80 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
19f90 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
19fa0 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
19fb0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
19fc0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
19fd0 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
19fe0 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
19ff0 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
1a000 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
1a010 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
1a020 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
1a030 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
1a040 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
1a050 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
1a060 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
1a070 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
1a080 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
1a090 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
1a0a0 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
1a0b0 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
1a0c0 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
1a0d0 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
1a0e0 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
1a0f0 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
1a100 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
1a110 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
1a120 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
1a130 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
1a140 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
1a150 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
1a160 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
1a170 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1a180 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
1a190 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
1a1a0 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
1a1b0 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
1a1c0 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
1a1d0 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
1a1e0 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
1a1f0 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
1a200 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
1a210 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
1a220 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
1a230 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
1a240 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
1a250 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1a260 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1a270 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
1a280 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
1a290 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1a2a0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1a2b0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
1a2c0 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
1a2d0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
1a2e0 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
1a2f0 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
1a300 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a310 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1a320 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
1a330 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
1a340 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1a350 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
1a360 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
1a370 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
1a380 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
1a390 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
1a3a0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
1a3b0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
1a3c0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
1a3d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
1a3e0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
1a3f0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
1a400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1a410 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a420 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
1a430 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  One(pPage1);.  p
1a440 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1a450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a460 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1a470 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1a480 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
1a490 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
1a4a0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1a4b0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1a4c0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1a4d0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1a4e0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1a4f0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1a500 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
1a510 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
1a520 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
1a530 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
1a540 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
1a550 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
1a560 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
1a570 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
1a580 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
1a590 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
1a5a0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
1a5b0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
1a5c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1a5d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1a5e0 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
1a5f0 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
1a600 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
1a610 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
1a620 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
1a630 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
1a640 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
1a650 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
1a660 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
1a670 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1a680 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1a690 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1a6a0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1a6b0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1a6c0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
1a6d0 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
1a6e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
1a6f0 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
1a700 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
1a710 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1a720 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1a730 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1a740 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
1a750 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
1a760 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
1a770 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
1a780 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
1a790 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
1a7a0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
1a7b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1a7c0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
1a7d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
1a7e0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
1a7f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1a800 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
1a810 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
1a820 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
1a830 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
1a840 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
1a850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1a860 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
1a870 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1a880 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1a890 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
1a8a0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
1a8b0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
1a8c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1a8d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1a8e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
1a8f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1a900 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
1a910 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
1a920 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
1a930 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1a940 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1a950 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
1a960 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
1a970 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1a980 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
1a990 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
1a9a0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
1a9b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
1a9c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
1a9d0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
1a9e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1a9f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1aa00 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  e(pPage1);.  }.}
1aa10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
1aa20 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
1aa30 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
1aa40 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
1aa50 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
1aa60 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
1aa70 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
1aa80 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1aa90 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
1aaa0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1aab0 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
1aac0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1aad0 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
1aae0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
1aaf0 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
1ab00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ab10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ab20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
1ab30 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
1ab40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ab50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
1ab60 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1ab70 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
1ab80 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
1ab90 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
1aba0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1abb0 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
1abc0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1abd0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
1abe0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
1abf0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
1ac00 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
1ac10 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
1ac20 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
1ac30 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
1ac40 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
1ac50 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
1ac60 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
1ac70 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
1ac80 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
1ac90 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
1aca0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
1acb0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
1acc0 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
1acd0 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
1ace0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
1acf0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
1ad00 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
1ad10 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
1ad20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
1ad30 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
1ad40 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
1ad50 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
1ad60 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
1ad70 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
1ad80 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
1ad90 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
1ada0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
1adb0 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
1adc0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
1add0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
1ade0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1adf0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
1ae00 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
1ae10 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1ae20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
1ae30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1ae40 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
1ae50 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
1ae60 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
1ae70 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
1ae80 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
1ae90 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
1aea0 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
1aeb0 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
1aec0 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
1aed0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
1aee0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
1aef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1af00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1af10 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
1af20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1af30 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
1af40 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
1af50 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
1af60 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
1af70 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
1af80 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
1af90 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
1afa0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1afb0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1afc0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
1afd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
1afe0 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
1aff0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1b000 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1b010 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
1b020 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
1b030 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
1b040 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b050 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b060 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b070 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
1b080 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
1b090 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
1b0a0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
1b0b0 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
1b0c0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1b0d0 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
1b0e0 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
1b0f0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1b100 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b110 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
1b120 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
1b130 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
1b140 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
1b150 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
1b160 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
1b170 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
1b180 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
1b190 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
1b1a0 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
1b1b0 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
1b1c0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
1b1d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1b1e0 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
1b1f0 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
1b200 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
1b210 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
1b220 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
1b230 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1b240 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1b250 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1b260 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
1b270 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
1b280 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
1b290 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1b2a0 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
1b2b0 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
1b2c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1b2d0 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
1b2e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
1b2f0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
1b300 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
1b310 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
1b320 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
1b330 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1b340 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
1b350 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
1b360 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
1b370 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
1b380 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
1b390 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
1b3a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b3b0 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
1b3c0 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
1b3d0 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
1b3e0 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
1b3f0 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
1b400 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
1b410 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
1b420 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
1b430 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
1b440 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
1b450 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
1b460 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
1b470 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
1b480 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1b490 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
1b4a0 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
1b4b0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
1b4c0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
1b4d0 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
1b4e0 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
1b4f0 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
1b500 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
1b510 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
1b520 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
1b530 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
1b540 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
1b550 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1b560 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1b570 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1b580 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1b590 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1b5a0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1b5b0 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1b5c0 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1b5d0 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1b5e0 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1b5f0 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1b600 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1b610 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1b620 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1b630 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1b640 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1b650 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1b660 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1b670 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1b680 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1b690 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1b6a0 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1b6b0 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1b6c0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1b6d0 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1b6e0 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1b6f0 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1b700 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b710 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1b720 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1b730 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
1b740 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b750 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b760 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1b770 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b780 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1b790 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b7a0 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1b7b0 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1b7c0 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1b7d0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1b7e0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1b7f0 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1b800 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1b810 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1b820 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1b830 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1b840 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1b850 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1b860 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1b870 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1b880 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1b890 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1b8a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b8b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1b8c0 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1b8d0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1b8e0 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
1b8f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1b900 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1b910 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1b920 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1b930 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1b940 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1b950 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1b960 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1b970 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1b980 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1b990 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1b9a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1b9b0 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20  ED_CACHE.  {.   
1b9c0 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
1b9d0 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20   = 0;.    /* If 
1b9e0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1b9f0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1ba00 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1ba10 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1ba20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73      ** on this s
1ba30 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1ba40 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1ba50 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1ba60 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72  tion is.    ** r
1ba70 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1ba80 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1ba90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1baa0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1bab0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1bac0 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20  ANS_WRITE).     
1bad0 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
1bae0 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
1baf0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1bb00 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1bb10 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20  Writer->db;.    
1bb20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1bb30 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f  >1 ){.      BtLo
1bb40 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20  ck *pIter;.     
1bb50 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1bb60 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1bb70 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1bb80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1bb90 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
1bba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1bbb0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1bbc0 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1bbd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bbe0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bbf0 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b  }.    if( pBlock
1bc00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bc10 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1bc20 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1bc30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1bc40 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1bc50 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67  EDCACHE;.      g
1bc60 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bc70 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1bc80 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1bc90 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1bca0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1bcb0 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1bcc0 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1bcd0 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1bce0 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1bcf0 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1bd00 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1bd10 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1bd20 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1bd30 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1bd40 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1bd50 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1bd60 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1bd70 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1bd80 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1bd90 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1bda0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1bdb0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1bdc0 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1bdd0 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1bde0 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1bdf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1be00 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1be10 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1be20 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1be30 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1be40 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1be50 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1be60 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1be70 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1be80 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1be90 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1bea0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1beb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1bec0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1bed0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1bee0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1bef0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1bf00 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1bf10 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1bf20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1bf30 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1bf40 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1bf50 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1bf60 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1bf70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1bf80 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1bf90 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1bfa0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1bfb0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1bfc0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1bfd0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1bfe0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1bff0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1c000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c010 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1c020 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1c030 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1c040 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1c050 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c060 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1c070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1c080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c090 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1c0a0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
1c0b0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1c0c0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1c0d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c0e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c0f0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1c100 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1c110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c120 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c140 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1c150 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1c160 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1c170 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1c180 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1c190 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1c1a0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1c1b0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1c1c0 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1c1d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1c1f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1c200 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1c210 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1c220 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1c230 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1c240 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1c250 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1c260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1c270 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1c280 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1c290 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1c2a0 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1c2b0 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1c2c0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1c2d0 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1c2e0 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1c2f0 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1c300 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1c310 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1c320 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1c330 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1c340 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1c350 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1c360 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1c370 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1c380 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1c390 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1c3a0 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1c3b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1c3c0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1c3d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c3e0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1c3f0 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1c400 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1c410 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1c420 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1c430 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1c440 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1c450 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1c460 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1c470 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1c480 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1c490 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1c4a0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1c4b0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1c4c0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1c4d0 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1c4e0 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1c4f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1c500 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1c510 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1c520 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1c530 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1c540 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1c550 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1c560 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1c570 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1c580 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1c590 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1c5a0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1c5b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1c5c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1c5d0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1c5e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1c5f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1c600 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1c610 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1c620 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1c630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c640 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1c650 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1c660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c680 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1c690 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1c6a0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1c6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c6c0 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1c6d0 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
1c6e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1c6f0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
1c700 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1c710 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1c720 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1c730 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1c740 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1c750 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1c760 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1c770 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1c780 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
1c790 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1c7a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1c7b0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1c7c0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1c7d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1c7e0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1c7f0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1c800 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
1c810 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
1c820 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1c830 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c840 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c850 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1c860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1c870 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1c880 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1c890 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1c8a0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1c8b0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1c8c0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1c8d0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1c8e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1c8f0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1c900 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1c910 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1c920 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1c930 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1c940 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1c950 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1c960 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c990 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1c9a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c9d0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1c9e0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1c9f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1ca20 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1ca30 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1ca40 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1ca50 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1ca60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ca70 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1ca80 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1ca90 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69  .  rc = pPage->i
1caa0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1cab0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1cac0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1cad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1cae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65  return rc;.  nCe
1caf0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1cb00 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
1cb10 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1cb20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1cb30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1cb40 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
1cb50 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
1cb60 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1cb70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1cb80 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1cb90 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1cba0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1cbb0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1cbc0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1cbd0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1cbe0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1cbf0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1cc00 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1cc10 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1cc20 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1cc30 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1cc40 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1cc50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1cc60 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1cc70 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1cc80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1cc90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1cca0 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1ccb0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1ccc0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1ccd0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1cce0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1ccf0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1cd00 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1cd10 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1cd20 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1cd30 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1cd40 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1cd50 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1cd60 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1cd70 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1cd80 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1cd90 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1cdb0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1cdc0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1cdd0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1cde0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1cdf0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1ce00 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1ce10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ce20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1ce30 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1ce40 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1ce50 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1ce60 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1ce70 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1ce80 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1ce90 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1cea0 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1ceb0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1cec0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1ced0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1cee0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1cef0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1cf00 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1cf10 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1cf20 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1cf30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cf40 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1cf50 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1cf60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1cf70 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1cf80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1cf90 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1cfa0 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1cfb0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1cfc0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1cfd0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1cfe0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1cff0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1d000 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1d010 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1d020 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d030 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d040 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
1d050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1d060 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1d070 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1d080 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1d090 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1d0a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1d0b0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1d0c0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1d0d0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1d0e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1d0f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d100 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1d110 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1d120 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1d130 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1d140 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1d150 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1d160 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1d170 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1d180 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1d190 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1d1a0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1d1b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1d1c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1d1d0 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1d1e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1d1f0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1d200 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1d210 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1d220 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1d230 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1d240 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d250 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
1d260 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
1d270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d280 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74    if( iFrom==get
1d290 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1d2a0 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20  .nSize-4) ){.   
1d2b0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1d2c0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1d2d0 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20  ze-4, iTo);.    
1d2e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d2f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d300 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1d310 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1d320 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1d330 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1d340 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1d350 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1d370 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d380 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1d390 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1d3a0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1d3b0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1d3c0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1d3d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1d3e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1d3f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d410 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
1d420 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
1d430 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1d440 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1d450 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1d460 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1d470 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1d480 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1d490 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1d4a0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1d4b0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1d4c0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1d4d0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1d4e0 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1d4f0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1d500 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1d510 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1d520 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1d530 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1d540 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1d550 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1d560 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1d570 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1d580 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1d590 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1d5a0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1d5b0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1d5c0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1d5d0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1d5e0 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1d5f0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1d600 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1d610 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1d620 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1d630 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1d640 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1d650 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1d660 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d680 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1d690 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1d6a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1d6b0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1d6c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1d6d0 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1d6e0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1d6f0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1d700 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1d710 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1d720 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1d730 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d750 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1d760 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1d770 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1d780 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1d790 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1d7a0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1d7b0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1d7c0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1d7d0 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1d7e0 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1d7f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1d800 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1d810 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1d820 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1d830 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1d840 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d850 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1d860 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1d870 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1d880 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1d890 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d8a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1d8b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1d8c0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1d8d0 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
1d8e0 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
1d8f0 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
1d900 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
1d910 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
1d920 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
1d930 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
1d940 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
1d950 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
1d960 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
1d970 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
1d980 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
1d990 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
1d9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d9b0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
1d9c0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
1d9d0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1d9e0 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
1d9f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1da00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1da10 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
1da20 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
1da30 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
1da40 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
1da50 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
1da60 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
1da70 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
1da80 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
1da90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1daa0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
1dab0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1dac0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
1dad0 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
1dae0 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
1daf0 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
1db00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
1db10 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
1db20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
1db30 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
1db40 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
1db50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
1db60 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
1db70 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
1db80 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
1db90 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
1dba0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
1dbb0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1dbc0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1dbd0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1dbe0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1dbf0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1dc00 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
1dc10 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
1dc20 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1dc30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dc40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dc50 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1dc60 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
1dc70 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
1dc80 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
1dc90 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
1dca0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1dcb0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
1dcc0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1dcd0 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
1dce0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
1dcf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dd00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1dd10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dd20 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
1dd30 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
1dd40 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
1dd50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
1dd60 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
1dd70 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
1dd80 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
1dd90 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
1dda0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
1ddb0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
1ddc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1ddd0 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
1dde0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1ddf0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1de00 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
1de10 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
1de20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1de30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1de40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1de50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1de60 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
1de70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
1de80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1de90 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
1dea0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1deb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1dec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ded0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1dee0 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
1def0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1df00 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
1df10 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1df20 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1df30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1df40 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1df50 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1df60 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
1df70 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
1df80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df90 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1dfa0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
1dfb0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1dfc0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
1dfd0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1dfe0 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
1dff0 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
1e000 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
1e010 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
1e020 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
1e030 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1e040 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
1e050 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
1e060 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
1e070 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
1e080 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
1e090 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
1e0a0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
1e0b0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
1e0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
1e0d0 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
1e0e0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
1e0f0 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
1e100 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
1e110 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
1e120 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
1e130 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
1e140 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
1e150 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
1e160 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1e170 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
1e180 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1e190 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
1e1a0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
1e1b0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
1e1c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e1d0 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
1e1e0 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
1e1f0 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
1e200 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
1e210 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1e220 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
1e230 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
1e240 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
1e250 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
1e260 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
1e270 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
1e280 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
1e290 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
1e2a0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
1e2b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1e2c0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
1e2d0 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
1e2e0 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
1e2f0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
1e300 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
1e310 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
1e320 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
1e330 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
1e340 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
1e350 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
1e360 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
1e370 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
1e380 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1e390 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
1e3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e3b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1e3c0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
1e3d0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
1e3e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1e3f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e400 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1e410 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
1e420 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
1e430 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
1e440 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
1e450 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
1e460 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e470 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
1e480 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
1e490 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
1e4a0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
1e4b0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e4c0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
1e4d0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
1e4e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e4f0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1e500 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1e510 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
1e520 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
1e530 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e550 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e560 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
1e570 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1e580 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
1e590 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e5a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1e5b0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
1e5c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1e5d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
1e5e0 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1e5f0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1e600 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
1e610 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
1e620 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1e630 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
1e640 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
1e650 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
1e660 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
1e670 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
1e680 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
1e690 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
1e6a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
1e6b0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
1e6c0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
1e6d0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
1e6e0 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
1e6f0 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
1e700 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1e710 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1e720 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
1e730 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1e740 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1e750 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1e760 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1e770 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
1e780 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
1e790 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e7a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e7c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e7d0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1e7e0 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
1e7f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e800 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1e810 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
1e820 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
1e830 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
1e840 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
1e850 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
1e860 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
1e870 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
1e880 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
1e890 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
1e8a0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
1e8b0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1e8c0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1e8d0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
1e8e0 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
1e8f0 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
1e900 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1e910 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1e920 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
1e930 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e940 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
1e950 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1e960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e970 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e980 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
1e990 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
1e9a0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
1e9b0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
1e9c0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
1e9d0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
1e9e0 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
1e9f0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1ea00 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
1ea10 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
1ea20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1ea30 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
1ea40 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
1ea50 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
1ea60 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
1ea70 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
1ea80 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
1ea90 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
1eaa0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
1eab0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
1eac0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1ead0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1eae0 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1eaf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1eb00 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1eb10 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1eb20 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1eb30 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1eb40 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1eb50 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1eb60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1eb70 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1eb80 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1eb90 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1eba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ebb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ebc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1ebd0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1ebe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ebf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1ec00 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1ec10 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1ec20 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1ec30 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1ec40 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1ec50 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1ec60 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1ec70 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1ec80 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1ec90 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1eca0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1ecb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ecc0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1ecd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ece0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1ecf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ed00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1ed10 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1ed20 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1ed30 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1ed40 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1ed50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ed60 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1ed70 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1ed80 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1ed90 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1eda0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1edb0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1edc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1edd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1ede0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1edf0 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1ee00 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1ee10 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1ee20 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1ee30 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1ee40 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1ee50 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1ee60 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1ee70 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1ee80 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1ee90 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1eea0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1eeb0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1eec0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1eed0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1eee0 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1eef0 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1ef00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ef20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1ef30 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1ef40 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ef70 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1ef80 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1ef90 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1efb0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1efc0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1efd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1efe0 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1eff0 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1f000 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1f010 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1f020 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1f030 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1f040 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1f050 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1f060 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1f070 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f080 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1f090 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1f0a0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1f0b0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1f0c0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1f0d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1f0e0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1f0f0 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1f100 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1f110 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1f120 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1f130 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1f140 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1f150 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1f160 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1f170 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1f180 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1f190 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1f1a0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1f1b0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1f1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1f1d0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1f1e0 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1f1f0 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1f200 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1f210 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1f220 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f230 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1f240 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1f250 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1f260 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1f270 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1f280 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1f290 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f2a0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1f2b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1f2c0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1f2d0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1f2e0 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1f2f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f300 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1f310 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f320 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1f330 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1f340 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1f350 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1f360 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1f370 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1f380 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1f390 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1f3a0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1f3b0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1f3c0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1f3d0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1f3e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1f3f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f400 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1f410 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1f420 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1f430 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1f440 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f460 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1f470 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1f480 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1f490 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1f4a0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1f4b0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1f4c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f4e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f4f0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1f500 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1f510 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1f520 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1f530 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1f540 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1f550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1f570 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1f580 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f590 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1f5a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f5b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1f5c0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1f5d0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1f5e0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1f5f0 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1f600 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1f610 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1f620 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1f630 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1f640 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1f650 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1f660 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1f670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1f680 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1f690 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1f6a0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1f6b0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1f6c0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1f6d0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1f6e0 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1f6f0 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1f700 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1f710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1f720 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1f730 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1f740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f750 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1f760 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1f770 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1f780 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1f790 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1f7a0 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61  (pPager); )..  a
1f7b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1f7c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1f7d0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1f7e0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1f7f0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1f800 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1f810 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1f820 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1f830 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1f840 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f850 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1f860 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1f870 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1f880 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1f890 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f8a0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1f8b0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1f8c0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1f8d0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1f8e0 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1f8f0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1f900 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1f910 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1f920 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1f930 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1f940 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1f950 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1f960 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f970 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1f980 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1f990 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1f9a0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1f9b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1f9c0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1f9d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1f9e0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1f9f0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1fa00 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1fa10 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1fa20 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1fa30 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1fa40 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1fa50 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1fa60 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1fa70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fa80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fa90 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1faa0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1fab0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1fac0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1fad0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1fae0 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1faf0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1fb00 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1fb10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fb20 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1fb30 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1fb40 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1fb50 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1fb60 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1fb70 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1fb80 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1fb90 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1fba0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1fbb0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1fbc0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1fbd0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1fbe0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1fbf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1fc00 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1fc10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fc20 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1fc30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1fc40 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1fc50 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1fc60 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1fc70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1fc80 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1fc90 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1fca0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1fcb0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1fcc0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1fcd0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1fce0 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1fcf0 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1fd00 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1fd10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fd20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1fd30 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1fd40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1fd50 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1fd60 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1fd70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1fd80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1fd90 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1fda0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fdb0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1fdc0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1fdd0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1fde0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1fdf0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1fe00 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1fe10 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1fe20 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1fe30 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1fe40 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1fe50 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1fe60 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1fe70 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1fe80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1fe90 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1fea0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1feb0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1fec0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1fed0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1fee0 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1fef0 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1ff00 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1ff10 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1ff20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1ff30 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1ff40 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1ff50 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1ff60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ff70 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1ff80 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1ff90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1ffa0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1ffb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ffc0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1ffd0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1ffe0 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1fff0 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
20000 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
20010 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
20020 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
20030 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
20040 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
20050 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
20060 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
20070 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
20080 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
20090 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
200a0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
200b0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
200c0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
200d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
200e0 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
200f0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
20100 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
20110 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
20120 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
20130 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
20140 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
20150 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
20160 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
20170 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20180 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
20190 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
201a0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
201b0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
201c0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
201d0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
201e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
201f0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
20200 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
20210 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
20220 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
20230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20240 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
20250 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
20260 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
20270 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
20280 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
20290 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
202a0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
202b0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
202c0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
202d0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
202e0 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
202f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
20300 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
20310 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
20320 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
20330 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20340 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20350 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
20360 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
20370 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
20380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
20390 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
203a0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
203b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
203c0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
203d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
203e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
203f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
20400 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
20410 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
20420 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
20430 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
20440 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20460 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20470 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
20480 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
20490 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
204a0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
204b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
204c0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
204d0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
204e0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
204f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
20500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
20510 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
20520 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
20530 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
20540 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20570 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20580 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
20590 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
205a0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
205b0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
205c0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
205d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
205e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
205f0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
20600 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
20610 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20620 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
20630 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
20640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
20650 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
20660 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
20670 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20680 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
20690 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
206a0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
206b0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
206c0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
206d0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
206e0 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
206f0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
20700 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
20710 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
20720 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
20730 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
20740 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
20750 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
20760 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
20770 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
20780 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
20790 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
207a0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
207b0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
207c0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
207d0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
207e0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
207f0 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
20800 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
20810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
20820 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
20830 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
20840 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
20850 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
20860 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
20870 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
20880 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
20890 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
208a0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
208b0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
208c0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
208d0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
208e0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
208f0 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
20900 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
20910 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
20920 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
20930 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
20940 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
20950 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
20960 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
20970 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
20980 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
20990 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
209a0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
209b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
209c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
209d0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
209e0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
209f0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
20a00 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
20a10 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
20a20 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
20a30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
20a40 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
20a50 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
20a60 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
20a70 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
20a80 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
20a90 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
20aa0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
20ab0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
20ac0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
20ad0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20ae0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
20af0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
20b00 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
20b10 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
20b20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
20b30 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
20b40 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
20b50 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
20b60 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
20b70 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
20b80 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
20b90 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
20ba0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20bb0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
20bc0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
20bd0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
20be0 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
20bf0 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
20c00 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
20c10 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
20c20 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
20c30 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
20c40 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
20c50 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
20c60 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
20c70 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
20c80 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
20c90 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
20ca0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
20cb0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
20cc0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
20cd0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
20ce0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
20cf0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
20d00 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
20d10 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
20d20 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
20d30 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
20d40 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
20d50 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
20d60 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
20d70 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
20d80 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
20d90 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
20da0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
20db0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
20dc0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
20dd0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
20de0 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
20df0 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
20e00 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
20e10 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
20e20 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
20e30 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
20e40 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
20e50 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
20e60 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
20e70 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
20e80 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
20e90 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
20ea0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
20eb0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
20ec0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
20ed0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
20ee0 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
20ef0 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
20f00 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
20f10 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
20f20 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
20f30 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
20f40 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
20f50 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
20f60 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
20f70 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
20f80 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
20f90 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
20fa0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
20fb0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
20fc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20fd0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
20fe0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
20ff0 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
21000 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
21010 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
21020 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
21030 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
21040 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
21050 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
21060 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
21070 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
21080 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
21090 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
210a0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
210b0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
210c0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
210d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
210e0 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
210f0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
21100 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
21110 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
21120 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
21130 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
21140 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
21150 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
21160 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21170 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21180 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
21190 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
211a0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
211b0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
211c0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
211d0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
211e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
211f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
21200 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
21210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21220 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
21230 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21240 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21250 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
21260 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44  .    }.    p->iD
21270 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f  ataVersion--;  /
21280 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72  * Compensate for
21290 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
212a0 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20  rsion++; */.    
212b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
212c0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
212d0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
212e0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
212f0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
21300 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
21310 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21320 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21340 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
21350 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
21360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21370 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
21380 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
21390 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
213a0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
213b0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
213c0 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
213d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
213e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
213f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21400 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
21410 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
21420 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21440 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21450 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
21460 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
21470 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
21480 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
21490 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
214a0 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65  r on any BtShare
214b0 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a  d that pBtree.**
214c0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72   references.  Or
214d0 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   if the writeOnl
214e0 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  y flag is set to
214f0 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a   1, then only.**
21500 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73   trip write curs
21510 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65  ors and leave re
21520 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61  ad cursors uncha
21530 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nged..**.** Ever
21540 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61  y cursor is a ca
21550 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72  ndidate to be tr
21560 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
21570 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74   cursors.** that
21580 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72   belong to other
21590 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
215a0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
215b0 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69  n to be.** shari
215c0 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ng the cache wit
215d0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
215e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
215f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
21600 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
21610 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
21620 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  y.** flag is tru
21630 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  e, then only wri
21640 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20  te-cursors need 
21650 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61  be tripped - rea
21660 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72  d-only.** cursor
21670 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72  s save their cur
21680 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73  rent positions s
21690 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20  o that they may 
216a0 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c  continue .** fol
216b0 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  lowing the rollb
216c0 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74  ack. Or, if writ
216d0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20  eOnly is false, 
216e0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
216f0 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20  .** tripped. In 
21700 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e  general, writeOn
21710 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74  ly is false if t
21720 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
21730 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  eing.** rolled b
21740 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65  ack modified the
21750 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
21760 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62  . In this case b
21770 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  -tree root.** pa
21780 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64  ges may be moved
21790 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
217a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
217b0 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67  together, making
217c0 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f  .** it unsafe fo
217d0 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74  r read cursors t
217e0 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a  o continue..**.*
217f0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  * If the writeOn
21800 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ly flag is true 
21810 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20  and an error is 
21820 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
21830 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65  e .** saving the
21840 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
21850 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  n of a read-only
21860 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72   cursor, all cur
21870 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64  sors, .** includ
21880 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72  ing all read-cur
21890 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
218a0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
218b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
218c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
218d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
218e0 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69  rs while.** savi
218f0 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69  ng a cursor posi
21900 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20  tion, an SQLite 
21910 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
21920 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  nt sqlite3BtreeT
21930 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
21940 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
21950 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72   errCode, int wr
21960 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75  iteOnly){.  BtCu
21970 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72  rsor *p;.  int r
21980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21990 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65    assert( (write
219a0 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65  Only==0 || write
219b0 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46  Only==1) && BTCF
219c0 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b  _WriteFlag==1 );
219d0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
219e0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
219f0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
21a00 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65      for(p=pBtree
21a10 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
21a20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
21a30 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
21a40 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
21a50 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
21a60 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
21a70 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
21a80 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21a90 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
21aa0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
21ab0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21ac0 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
21ad0 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
21ae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
21b00 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
21b10 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
21b20 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
21b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
21b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21b50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21b80 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
21b90 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
21ba0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
21bb0 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
21bc0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
21bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65      }.      btre
21be0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
21bf0 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d  rPages(p);.    }
21c00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21c10 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
21c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
21c40 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
21c50 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
21c60 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
21c70 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
21c80 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
21c90 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
21ca0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
21cb0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
21cc0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
21cd0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
21ce0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
21cf0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
21d00 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
21d10 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
21d20 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
21d30 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
21d40 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
21d50 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
21d60 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
21d70 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
21d80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21d90 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
21da0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
21db0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
21dc0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
21dd0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
21de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21df0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
21e00 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
21e10 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
21e20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
21e30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21e40 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
21e50 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
21e60 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
21e70 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
21e80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
21e90 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
21ea0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
21eb0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
21ec0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
21ed0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
21ee0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
21ef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f00 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
21f10 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
21f20 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
21f30 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
21f40 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
21f50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21f60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
21f70 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
21f80 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
21f90 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
21fa0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
21fb0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
21fc0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21fd0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
21fe0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
21ff0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
22000 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
22010 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
22020 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
22030 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
22040 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
22050 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
22060 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
22070 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
22080 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
22090 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
220a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
220b0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
220c0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
220d0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
220e0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
220f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
22100 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
22110 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
22120 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
22130 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
22140 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
22150 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
22160 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
22170 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
22180 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
22190 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
221a0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
221b0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
221c0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
221d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
221e0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
221f0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
22200 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
22210 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
22220 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
22230 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
22240 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
22250 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
22260 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
22270 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
22280 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
22290 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
222a0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
222b0 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b  PageOne(pPage1);
222c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
222d0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
222e0 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
222f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
22300 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
22310 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
22320 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
22330 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
22340 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
22350 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
22360 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22370 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22380 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
22390 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
223a0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
223b0 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
223c0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
223d0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
223e0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
223f0 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
22400 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
22410 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
22420 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
22430 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
22440 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
22450 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
22460 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
22470 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
22480 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
22490 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
224a0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
224b0 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
224c0 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
224d0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
224e0 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
224f0 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
22500 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
22510 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
22520 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
22530 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
22540 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
22550 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
22560 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
22570 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
22580 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
22590 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
225a0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
225b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
225c0 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
225d0 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
225e0 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
225f0 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
22600 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
22610 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
22620 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
22630 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
22640 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
22650 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
22660 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
22670 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
22680 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
22690 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
226a0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
226b0 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
226c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
226d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
226e0 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
226f0 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
22700 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
22710 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
22720 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
22730 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
22740 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
22750 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
22760 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22770 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
22780 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
22790 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
227a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
227b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
227c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
227d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
227e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
227f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
22800 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
22810 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
22820 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
22830 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
22840 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
22850 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
22860 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
22870 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
22880 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
22890 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
228a0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
228b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
228c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
228d0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
228e0 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
228f0 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
22900 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
22910 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
22920 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
22930 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
22940 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
22950 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
22960 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
22970 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
22980 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
22990 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
229a0 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
229b0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
229c0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
229d0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
229e0 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
229f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22a00 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
22a10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
22a20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
22a30 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22a40 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
22a50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22a60 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
22a70 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
22a80 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
22a90 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
22aa0 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
22ab0 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
22ac0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
22ad0 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
22ae0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
22af0 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
22b00 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
22b10 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
22b20 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
22b30 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
22b40 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
22b50 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
22b60 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
22b70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
22b80 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
22b90 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
22ba0 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
22bb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
22bc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
22bd0 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
22be0 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
22bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
22c00 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
22c10 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
22c20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
22c30 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
22c40 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
22c50 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
22c60 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
22c70 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
22c80 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
22c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
22ca0 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
22cb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
22cc0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
22cd0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
22ce0 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
22cf0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
22d00 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
22d10 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
22d20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
22d30 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
22d40 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
22d50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22d60 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
22d70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
22d80 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
22d90 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
22da0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
22db0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
22dc0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
22dd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
22df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
22e00 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
22e10 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
22e20 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
22e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22e40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
22e50 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
22e60 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
22e70 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
22e80 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
22e90 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
22ea0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
22eb0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
22ec0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
22ed0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
22ee0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
22ef0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
22f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22f10 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
22f20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
22f30 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
22f40 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
22f50 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
22f60 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
22f70 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
22f80 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
22f90 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
22fa0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
22fb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
22fc0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
22fd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
22fe0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
22ff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23000 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
23010 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
23020 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
23030 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
23040 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
23050 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
23060 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
23070 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
23080 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
23090 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
230a0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
230b0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
230c0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
230d0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
230e0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
230f0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
23100 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
23110 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
23120 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
23130 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
23140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54  .**.** If the BT
23150 52 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66  REE_WRCSR bit of
23160 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72   wrFlag is clear
23170 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23180 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65  r can only.** be
23190 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
231a0 67 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45  g.  If the BTREE
231b0 5f 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65  _WRCSR bit is se
231c0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
231d0 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  or.** can be use
231e0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
231f0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20   for writing if 
23200 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
23210 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20   for writing.** 
23220 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
23230 68 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e  hese are the con
23240 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
23250 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
23260 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67  r.** for writing
23270 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a   to be allowed:.
23280 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
23290 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
232a0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
232b0 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e  wrFlag containin
232c0 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  g BTREE_WRCSR.**
232d0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
232e0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
232f0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
23300 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
23310 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
23320 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
23330 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
23340 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
23350 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
23360 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
23370 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
23380 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
23390 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
233a0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
233b0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
233c0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
233d0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
233e0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
233f0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
23400 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
23410 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
23420 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
23430 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
23440 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
23450 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
23460 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
23470 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
23480 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52  n..**.** The BTR
23490 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74  EE_FORDELETE bit
234a0 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f   of wrFlag may o
234b0 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74  ptionally be set
234c0 20 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a   if BTREE_WRCSR.
234d0 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46  ** is set.  If F
234e0 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c  ORDELETE is set,
234f0 20 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20   that is a hint 
23500 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
23510 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68  ation that.** th
23520 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f  is cursor will o
23530 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73  nly be used to s
23540 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74  eek to and delet
23550 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20  e entries of an 
23560 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74  index.** as part
23570 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c   of a larger DEL
23580 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ETE statement.  
23590 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69  The FORDELETE hi
235a0 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  nt is not used b
235b0 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d  y.** this implem
235c0 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69  entation.  But i
235d0 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c  n a hypothetical
235e0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f   alternative sto
235f0 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20  rage engine .** 
23600 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65  in which index e
23610 6e 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d  ntries are autom
23620 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
23630 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64   when correspond
23640 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77  ing table.** row
23650 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74  s are deleted, t
23660 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61  he FORDELETE fla
23670 67 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74  g is a hint that
23680 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45   all SEEK and DE
23690 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  LETE.** operatio
236a0 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f  ns on this curso
236b0 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20  r can be no-ops 
236c0 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65  and all READ ope
236d0 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20  rations can .** 
236e0 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f  return a null ro
236f0 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31  w (2-bytes: 0x01
23700 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   0x00)..**.** No
23710 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
23720 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
23730 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
23740 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
23750 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
23760 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
23770 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
23780 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
23790 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
237a0 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
237b0 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
237c0 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
237d0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
237e0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
237f0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
23800 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
23810 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
23820 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
23830 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
23840 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
23850 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
23860 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23880 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
23890 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
238c0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
238d0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
238e0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
23910 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
23920 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
23930 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
23940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
23950 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
23960 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
23970 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
23980 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
23990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
239a0 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
239b0 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
239c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
239d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
239e0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
239f0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
23a00 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20  Cursor *pX;     
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20       /* Looping 
23a30 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63  over other all c
23a40 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73  ursors */..  ass
23a50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
23a60 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
23a70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
23a80 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ag==0 .       ||
23a90 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57   wrFlag==BTREE_W
23aa0 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  RCSR .       || 
23ab0 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57  wrFlag==(BTREE_W
23ac0 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45  RCSR|BTREE_FORDE
23ad0 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f  LETE) .  );..  /
23ae0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23af0 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
23b00 73 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66  s verify that if
23b10 20 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61   this is a shara
23b20 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65  ble .  ** b-tree
23b30 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
23b40 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
23b50 64 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65  ding the require
23b60 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a  d table locks, .
23b70 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f    ** and that no
23b80 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
23b90 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63  n has any open c
23ba0 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c  ursor that confl
23bb0 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20  icts with .  ** 
23bc0 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20  this lock.  */. 
23bd0 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
23be0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
23bf0 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79  (p, iTable, pKey
23c00 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67  Info!=0, (wrFlag
23c10 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65  ?2:1)) );.  asse
23c20 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
23c30 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
23c40 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
23c50 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
23c60 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
23c70 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
23c80 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
23c90 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
23ca0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
23cb0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
23cc0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
23cd0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
23ce0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
23cf0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
23d00 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
23d10 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
23d20 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
23d30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
23d40 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
23d50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72  ==0 );..  if( wr
23d60 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  Flag ){.    allo
23d70 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
23d80 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  t);.    if( pBt-
23d90 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20  >pTmpSpace==0 ) 
23da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
23db0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
23dc0 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26  if( iTable==1 &&
23dd0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
23de0 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pBt)==0 ){.    a
23df0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
23e00 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d   );.    iTable =
23e10 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f   0;.  }..  /* No
23e20 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
23e30 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
23e40 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
23e50 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
23e60 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  .  ** variables 
23e70 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  and link the cur
23e80 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
23e90 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a  hared list.  */.
23ea0 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
23eb0 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b   = (Pgno)iTable;
23ec0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d  .  pCur->iPage =
23ed0 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65   -1;.  pCur->pKe
23ee0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
23ef0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65  ;.  pCur->pBtree
23f00 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42   = p;.  pCur->pB
23f10 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d  t = pBt;.  pCur-
23f20 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c  >curFlags = wrFl
23f30 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46  ag ? BTCF_WriteF
23f40 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d  lag : 0;.  pCur-
23f50 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d  >curPagerFlags =
23f60 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41   wrFlag ? 0 : PA
23f70 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
23f80 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ;.  /* If there 
23f90 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
23fa0 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
23fb0 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
23fc0 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75  all such.  ** cu
23fd0 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76  rsors *must* hav
23fe0 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  e the BTCF_Multi
23ff0 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f  ple flag set. */
24000 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70  .  for(pX=pBt->p
24010 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70  Cursor; pX; pX=p
24020 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
24030 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  f( pX->pgnoRoot=
24040 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b  =(Pgno)iTable ){
24050 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c  .      pX->curFl
24060 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
24070 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72  iple;.      pCur
24080 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
24090 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
240a0 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70   }.  }.  pCur->p
240b0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72  Next = pBt->pCur
240c0 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72  sor;.  pBt->pCur
240d0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
240e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
240f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72  SOR_INVALID;.  r
24100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24110 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
24120 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
24130 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24160 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
24170 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
241a0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
241b0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
241c0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
241f0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
24200 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
24210 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
24240 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
24250 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24280 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
24290 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
242a0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61  nt rc;.  if( iTa
242b0 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20  ble<1 ){.    rc 
242c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
242d0 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
242e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
242f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
24300 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70   = btreeCursor(p
24310 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67  , iTable, wrFlag
24320 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72  , pKeyInfo, pCur
24330 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
24340 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
24350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24360 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24370 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
24380 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
24390 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
243a0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
243b0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
243c0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
243d0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
243e0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
243f0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
24400 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
24410 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
24420 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
24430 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
24440 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
24450 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
24460 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
24470 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
24480 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24490 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
244a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
244b0 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
244c0 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
244d0 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
244e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
244f0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
24500 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
24510 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
24520 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
24530 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
24540 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
24550 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
24560 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
24570 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
24580 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
24590 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
245a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
245b0 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
245c0 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
245d0 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
245e0 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
245f0 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
24600 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
24610 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
24620 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
24630 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
24640 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
24650 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
24660 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
24670 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
24680 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20  Close a cursor. 
24690 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f   The read lock o
246a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
246b0 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a  ile is released.
246c0 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  ** when the last
246d0 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65   cursor is close
246e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
246f0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
24700 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
24710 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  ){.  Btree *pBtr
24720 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  ee = pCur->pBtre
24730 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  e;.  if( pBtree 
24740 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
24750 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
24760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24770 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
24780 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
24790 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
247a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
247b0 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
247c0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
247d0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
247e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
247f0 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
24800 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24810 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
24820 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
24830 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
24840 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
24850 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
24860 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
24870 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
24880 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
24890 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
248a0 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
248b0 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
248c0 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
248d0 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
248e0 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63  pCur);.    unloc
248f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
24900 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
24910 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
24920 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69  rflow);.    sqli
24930 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
24940 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Key);.    sqlite
24950 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
24960 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
24970 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24980 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
24990 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
249a0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
249b0 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
249c0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
249d0 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
249e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
249f0 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
24a00 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
24a10 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
24a20 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
24a30 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
24a40 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
24a50 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
24a60 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
24a70 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
24a80 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
24a90 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
24aa0 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a  ParseCell()..*/.
24ab0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
24ac0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
24ad0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
24ae0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
24af0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
24b00 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
24b10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
24b20 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
24b30 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
24b40 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69  ge, pCur->ix, &i
24b50 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
24b60 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
24b70 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
24b80 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
24b90 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
24ba0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
24bb0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
24bc0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
24bd0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
24be0 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
24bf0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
24c00 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
24c10 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
24c20 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  {.    pCur->curF
24c30 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
24c40 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65  idNKey;.    btre
24c50 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
24c60 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c  >pPage,pCur->ix,
24c70 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
24c80 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
24c90 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
24ca0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
24cb0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
24cc0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
24cd0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
24ce0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
24cf0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
24d00 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
24d10 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
24d20 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
24d30 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
24d40 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
24d50 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
24d60 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
24d70 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
24d80 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
24d90 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
24da0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
24db0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
24dc0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
24dd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24de0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
24df0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
24e00 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
24e10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24e20 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
24e30 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20  * NDEBUG */.int 
24e40 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
24e50 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75  orIsValidNN(BtCu
24e60 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
24e70 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29  ssert( pCur!=0 )
24e80 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  ;.  return pCur-
24e90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24ea0 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
24eb0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
24ec0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
24ed0 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66  key or "rowid" f
24ee0 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
24ef0 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
24f00 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20  e is only valid 
24f10 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
24f20 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
24f30 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  to a.** ordinary
24f40 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49   table btree.  I
24f50 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  f the cursor poi
24f60 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  nts to an index 
24f70 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69  btree or.** is i
24f80 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75  nvalid, the resu
24f90 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  lt of this routi
24fa0 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ne is undefined.
24fb0 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
24fc0 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42  treeIntegerKey(B
24fd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24fe0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24ff0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25010 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25020 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25030 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
25040 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65  ntKey );.  getCe
25050 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
25060 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66  return pCur->inf
25070 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  o.nKey;.}../*.**
25080 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
25090 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70  er of bytes of p
250a0 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65  ayload for the e
250b0 6e 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69  ntry that pCur i
250c0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70  s.** currently p
250d0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72  ointing to.  For
250e0 20 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74   table btrees, t
250f0 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25100 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74  amount.** of dat
25110 61 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74  a.  For index bt
25120 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  rees, this will 
25130 62 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  be the size of t
25140 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
25150 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
25160 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
25170 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
25180 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
25190 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
251a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
251b0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
251c0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
251d0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
251e0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
251f0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
25200 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75  RSOR_VALID..*/.u
25210 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  32 sqlite3BtreeP
25220 61 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72  ayloadSize(BtCur
25230 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25240 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25250 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25260 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25270 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25280 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
25290 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
252a0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
252b0 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a  .nPayload;.}../*
252c0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
252d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
252e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
252f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
25300 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
25310 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
25320 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
25330 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
25340 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
25350 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
25360 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
25370 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
25380 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
25390 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
253a0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
253b0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
253c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
253d0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
253e0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
253f0 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
25400 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
25410 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
25420 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
25430 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
25440 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
25450 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
25460 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
25470 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
25480 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
25490 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
254a0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
254b0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
254c0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
254d0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
254e0 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
254f0 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
25500 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
25510 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
25520 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
25530 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
25540 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
25550 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
25560 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
25570 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
25580 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
25590 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
255a0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
255b0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
255c0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
255d0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
255e0 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
255f0 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
25600 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
25610 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
25620 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
25630 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
25640 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
25650 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
25660 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
25670 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
25680 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
25690 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
256a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
256b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
256c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
256f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
25700 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
25710 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
25720 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
25730 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
25740 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
25750 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
25760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
25770 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
25780 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
25790 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
257a0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
257b0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
257c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
257d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
257e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
257f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
25800 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
25810 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
25820 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
25830 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
25840 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
25850 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
25860 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
25870 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
25880 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
25890 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
258a0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
258b0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
258c0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
258d0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
258e0 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
258f0 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
25900 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
25910 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
25920 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
25930 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
25940 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
25950 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
25960 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
25970 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
25980 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
25990 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
259a0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
259b0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
259c0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
259d0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
259e0 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
259f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
25a00 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
25a10 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
25a20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
25a30 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
25a40 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
25a50 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
25a60 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
25a70 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
25a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25a90 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
25aa0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
25ab0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
25ac0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
25ad0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
25ae0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
25af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
25b00 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
25b10 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
25b20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
25b30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25b40 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
25b50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25b60 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
25b70 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
25b80 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
25b90 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
25ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25bb0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
25bc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
25be0 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
25bf0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
25c00 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
25c10 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
25c20 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
25c30 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
25c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
25c50 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
25c60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
25c70 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
25c80 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
25c90 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
25ca0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
25cb0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
25cc0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
25cd0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
25ce0 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
25cf0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
25d00 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
25d10 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
25d20 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
25d30 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
25d40 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
25d50 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
25d60 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
25d70 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
25d80 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
25d90 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
25da0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
25db0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
25dc0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
25dd0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
25de0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
25df0 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
25e00 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
25e10 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
25e20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
25e30 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
25e40 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
25e50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
25e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
25e70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
25e80 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
25e90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
25ea0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
25eb0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25ed0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
25ee0 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
25ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
25f10 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
25f20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
25f30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
25f40 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
25f50 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
25f60 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
25f70 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
25f80 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
25f90 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
25fa0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
25fb0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
25fc0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
25fd0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
25fe0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
25ff0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
26000 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
26010 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
26020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
26040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
26050 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
26060 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
26070 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
26080 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
26090 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
260a0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
260b0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
260c0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
260d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
260e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
260f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26100 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
26110 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
26120 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
26130 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
26140 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
26150 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
26160 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
26170 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
26180 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
26190 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
261a0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
261b0 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
261c0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
261d0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
261e0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
261f0 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
26200 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
26210 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
26220 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
26230 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
26240 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
26250 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
26260 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
26270 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
26280 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
26290 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
262a0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
262b0 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
262c0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
262d0 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
262e0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
262f0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
26300 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
26310 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
26320 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
26330 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
26340 70 61 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75  pages.** this fu
26350 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
26360 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
26370 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  d lazily populat
26380 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f  e.** the overflo
26390 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
263a0 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
263b0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
263c0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
263d0 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
263e0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
263f0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
26400 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
26410 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
26420 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
26430 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
26440 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
26450 6f 63 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20  ocated, it must 
26460 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
26470 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
26480 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
26490 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
264a0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
264b0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
264c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
264d0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
264e0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
264f0 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
26500 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
26510 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
26520 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
26530 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
26540 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
26550 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
26560 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
26570 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
26580 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
26590 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
265a0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
265b0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
265c0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
265d0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
265e0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
265f0 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
26600 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
26610 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
26620 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
26630 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
26640 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
26650 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
26660 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26680 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
26690 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
266a0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
266b0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
266c0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
266d0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
266f0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
26700 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
26710 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
26720 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
26730 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
26740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
26750 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
26760 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
26770 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->pPage;        
26780 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
26790 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
267a0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
267b0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
267c0 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
267d0 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
267e0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
267f0 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
26800 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
26810 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
26820 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
26830 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
26840 20 70 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74   pBuf;     /* St
26850 61 72 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  art of original 
26860 6f 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65  out buffer */.#e
26870 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
26880 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
26890 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70  t( eOp==0 || eOp
268a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
268b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
268c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
268d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
268e0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
268f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
26900 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26910 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c  r) );..  getCell
26920 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
26930 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
26940 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.pPayload;.  
26950 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61  assert( offset+a
26960 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  mt <= pCur->info
26970 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20  .nPayload );..  
26980 61 73 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64  assert( aPayload
26990 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20   > pPage->aData 
269a0 29 3b 0a 20 20 69 66 28 20 28 75 70 74 72 29 28  );.  if( (uptr)(
269b0 61 50 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65  aPayload - pPage
269c0 2d 3e 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d  ->aData) > (pBt-
269d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43  >usableSize - pC
269e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29  ur->info.nLocal)
269f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
26a00 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
26a10 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
26a20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
26a30 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20  n error.  The.  
26a40 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c    ** conditional
26a50 20 61 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79   above is really
26a60 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61  :.    **    &aPa
26a70 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
26a80 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67  .nLocal] > &pPag
26a90 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73  e->aData[pBt->us
26aa0 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a  ableSize].    **
26ab0 20 62 75 74 20 69 73 20 72 65 63 61 73 74 20 69   but is recast i
26ac0 6e 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20  nto its current 
26ad0 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e  form to avoid in
26ae0 74 65 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70  teger overflow p
26af0 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20  roblems.    */. 
26b00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26b10 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50  _CORRUPT_PGNO(pP
26b20 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
26b30 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
26b40 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
26b50 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
26b60 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
26b70 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
26b80 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
26b90 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
26ba0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
26bb0 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
26bc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
26bd0 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
26be0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
26bf0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
26c00 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
26c10 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
26c20 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
26c30 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
26c40 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
26c50 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
26c60 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
26c70 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
26c80 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
26c90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
26ca0 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  }...  if( rc==SQ
26cb0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
26cc0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
26cd0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
26ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
26cf0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
26d00 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
26d10 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
26d20 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
26d30 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26d40 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
26d50 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
26d60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42  .    /* If the B
26d70 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
26d80 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  w[] has not been
26d90 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
26da0 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20  cate it now..   
26db0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
26dc0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
26dd0 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
26de0 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
26df0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
26e00 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
26e10 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
26e20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
26e30 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
26e40 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
26e50 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
26e60 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
26e70 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
26e80 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
26e90 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
26ea0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
26eb0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
26ec0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
26ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26ee0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
26ef0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26f00 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
26f10 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
26f20 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
26f30 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
26f40 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
26f50 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
26f60 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
26f70 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
26f80 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
26f90 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
26fa0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
26fb0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
26fc0 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
26fd0 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
26fe0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
26ff0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
27000 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27010 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
27020 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27030 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
27040 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
27050 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
27060 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
27070 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
27080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
27090 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
270a0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
270b0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
270c0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
270d0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
270e0 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
270f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
27100 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27110 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
27120 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
27130 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
27140 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
27150 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
27160 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
27170 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
27180 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
27190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
271a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
271b0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
271c0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
271d0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
271e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
271f0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
27200 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27210 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
27220 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
27230 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
27240 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
27250 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27260 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
27270 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
27280 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
27290 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
272a0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
272b0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
272c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
272d0 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
272e0 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
272f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
27300 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27310 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
27320 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
27330 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
27340 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
27350 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
27360 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
27370 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
27380 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27390 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
273a0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
273b0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
273c0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
273d0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
273e0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
273f0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
27400 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
27410 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
27420 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
27430 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
27440 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
27450 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
27460 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
27470 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
27480 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
27490 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
274a0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
274b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
274c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
274d0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
274e0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
274f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27500 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
27510 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
27520 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
27530 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
27540 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
27550 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
27560 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
27570 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27580 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
27590 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
275a0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
275b0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
275c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
275d0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
275e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
275f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
27600 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
27610 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
27620 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
27630 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
27640 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
27650 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
27660 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
27670 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
27680 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
27690 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
276a0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
276b0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
276c0 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c  *fd;      /* Fil
276d0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
276e0 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c  do direct overfl
276f0 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  ow read */.#endi
27700 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
27710 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
27720 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
27730 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
27740 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
27750 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
27760 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
27770 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
27780 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
27790 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
277a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
277b0 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
277c0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
277d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
277e0 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
277f0 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
27800 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
27810 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
27820 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
27830 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
27840 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20    **   3) there 
27850 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
27860 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
27870 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
27880 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
27890 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
278a0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
278b0 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
278c0 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
278d0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
278e0 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
278f0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
27900 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
27910 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
27920 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
27930 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
27940 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
27950 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
27960 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
27970 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
27980 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
27990 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
279a0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
279b0 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
279c0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
279d0 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
279e0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
279f0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
27a00 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
27a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
27a20 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a50 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
27a60 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
27aa0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
27ab0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
27ac0 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
27ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ae0 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
27af0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
27b00 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
27b10 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
27b20 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34  ethods     /* (4
27b30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
27b40 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
27b50 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  UseWal(pBt->pPag
27b60 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
27b70 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
27b80 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
27b90 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27bc0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
27bd0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
27be0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
27bf0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
27c00 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
27c10 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
27c20 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
27c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
27c50 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
27c60 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
27c70 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
27c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27c90 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
27ca0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
27cb0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
27cc0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
27cd0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
27ce0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
27cf0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
27d00 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
27d10 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
27d20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
27d30 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
27d40 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
27d50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
27d60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27d70 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
27d80 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
27d90 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
27da0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
27db0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
27dc0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
27dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
27e00 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
27e10 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
27e20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27e30 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
27e40 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
27e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
27e60 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
27e70 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
27e80 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
27e90 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
27ea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
27eb0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
27ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
27ed0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
27ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27ef0 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
27f00 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
27f10 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
27f20 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
27f30 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
27f40 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
27f50 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
27f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
27f70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27f80 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
27f90 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
27fa0 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
27fb0 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
27fc0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27fd0 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
27fe0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
27ff0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
28000 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  ad part of the p
28010 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72  ayload for the r
28020 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74  ow at which that
28030 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28040 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
28050 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79  nting.  "amt" by
28060 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
28070 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
28080 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
28090 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
280a0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
280b0 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e  pCur can be poin
280c0 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61  ting to either a
280d0 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64   table or an ind
280e0 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66  ex b-tree..** If
280f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
28100 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e  able btree, then
28110 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63   the content sec
28120 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49  tion is read.  I
28130 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69  f.** pCur is poi
28140 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  nting to an inde
28150 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68  x b-tree then th
28160 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73  e key section is
28170 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
28180 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28190 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c  load(), the call
281a0 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
281b0 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
281c0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
281d0 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61  id row in the ta
281e0 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65  ble.  For sqlite
281f0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28200 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63  cked(), the.** c
28210 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69  ursor might be i
28220 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20  nvalid or might 
28230 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f  need to be resto
28240 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
28250 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   read..**.** Ret
28260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
28270 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
28280 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
28290 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
282a0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
282b0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
282c0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
282d0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
282e0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
282f0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28300 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42  e3BtreePayload(B
28310 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28320 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28330 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28350 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
28360 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28370 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28380 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28390 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
283a0 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
283b0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
283c0 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
283d0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
283e0 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
283f0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
28400 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
28410 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
28420 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
28430 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71  is variant of sq
28440 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28450 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69  d() works even i
28460 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
28470 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43   not.** in the C
28480 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74  URSOR_VALID stat
28490 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  e.  It is only u
284a0 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
284b0 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a  e3_blob_read().*
284c0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  * interface..*/.
284d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
284e0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61  MIT_INCRBLOB.sta
284f0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
28500 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61  INE int accessPa
28510 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20  yloadChecked(.  
28520 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  BtCursor *pCur,.
28530 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20    u32 offset,.  
28540 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20  u32 amt,.  void 
28550 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72  *pBuf.){.  int r
28560 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  c;.  if ( pCur->
28570 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28580 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
28590 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
285a0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
285b0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
285c0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  red(pCur) );.  r
285d0 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
285e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
285f0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
28600 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50  c ? rc : accessP
28610 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
28620 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
28630 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
28640 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28650 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
28660 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28670 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28680 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75  pBuf){.  if( pCu
28690 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
286a0 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
286b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
286c0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
286d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  );.    return ac
286e0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
286f0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28700 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  Buf, 0);.  }else
28710 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  {.    return acc
28720 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
28730 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28740 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a  amt, pBuf);.  }.
28750 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
28760 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
28770 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
28780 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
28790 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
287a0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
287b0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
287c0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
287d0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
287e0 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
287f0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
28800 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
28810 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
28820 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
28830 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
28840 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
28850 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
28860 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
28870 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
28880 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
28890 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
288a0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
288b0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
288c0 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
288d0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
288e0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
288f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
28900 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
28910 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
28920 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
28930 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
28940 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
28950 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
28960 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
28970 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
28980 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
28990 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
289a0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
289b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
289c0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
289d0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
289e0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
289f0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
28a00 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
28a10 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
28a20 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28a30 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
28a40 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
28a50 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
28a60 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
28a70 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
28a80 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
28a90 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
28aa0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
28ab0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
28ac0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
28ad0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
28ae0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
28af0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
28b00 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
28b10 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
28b20 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
28b30 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
28b40 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
28b50 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
28b60 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
28b70 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
28b80 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
28b90 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
28ba0 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
28bb0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
28bc0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
28bd0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
28be0 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74 3b 0a  /.){.  u32 amt;.
28bf0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
28c00 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
28c10 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
28c20 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
28c30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28c40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28c50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
28c60 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
28c70 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
28c80 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28c90 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28ca0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28cb0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
28cc0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
28cd0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
28ce0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
28cf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
28d00 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
28d10 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad>pCur->pPage->
28d20 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
28d30 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
28d40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
28d50 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65  load<pCur->pPage
28d60 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
28d70 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
28d80 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  = (int)(pCur->pP
28d90 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
28da0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
28db0 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
28dc0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
28dd0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
28de0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
28df0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
28e00 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
28e10 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
28e20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
28e30 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
28e40 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
28e50 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
28e60 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
28e70 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
28e80 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
28e90 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
28ea0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
28eb0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
28ec0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
28ed0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
28ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
28ef0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
28f00 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
28f10 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
28f20 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
28f30 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
28f40 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
28f50 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
28f60 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
28f70 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
28f80 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
28f90 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
28fa0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
28fb0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
28fc0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
28fd0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
28fe0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
28ff0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
29000 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
29010 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
29020 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
29030 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
29040 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
29050 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
29060 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
29070 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
29080 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
29090 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
290a0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
290b0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
290c0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
290d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
290e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
290f0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
29100 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
29110 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
29120 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
29130 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
29140 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
29150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
29160 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
29170 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
29180 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
29190 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
291a0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
291b0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
291c0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
291d0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
291e0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
291f0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
29200 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
29210 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
29220 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
29230 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
29240 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
29250 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29260 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
29270 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29280 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
29290 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
292a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
292b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
292c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
292d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
292e0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
292f0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
29300 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
29310 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29320 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
29330 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
29340 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
29350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29360 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29370 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
29380 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
29390 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
293a0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
293b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
293c0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
293d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
293e0 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d  Cur->ix;.  pCur-
293f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29400 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61  age] = pCur->pPa
29410 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  ge;.  pCur->ix =
29420 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
29430 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  e++;.  return ge
29440 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
29450 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
29460 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70  ->pPage, pCur, p
29470 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
29480 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  gs);.}..#ifdef S
29490 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
294a0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
294b0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
294c0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
294d0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
294e0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
294f0 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
29500 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
29510 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
29520 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
29530 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
29540 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
29550 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
29560 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
29570 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
29580 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
29590 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
295a0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
295b0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
295c0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
295d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
295e0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
295f0 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
29600 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
29610 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
29620 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
29630 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
29640 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
29650 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
29680 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
29690 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
296a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
296b0 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
296c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
296d0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
296e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
296f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
29700 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
29710 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29720 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
29730 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
29740 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
29750 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
29760 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
29770 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
29780 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
29790 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
297a0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
297b0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
297c0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
297d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
297e0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
297f0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
29800 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
29810 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
29820 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
29830 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
29840 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
29850 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
29860 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
29870 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
29880 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
29890 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
298a0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
298b0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
298c0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  ){.  MemPage *pL
298d0 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63  eaf;.  assert( c
298e0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
298f0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
29900 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
29910 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29930 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
29940 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
29950 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50  age );.  assertP
29960 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
29970 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29980 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
29990 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
299a0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
299b0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e     pCur->pPage->
299c0 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
299d0 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
299e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
299f0 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
29a00 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
29a10 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
29a20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
29a30 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
29a40 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
29a50 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29a60 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Ovfl);.  pCur->i
29a70 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
29a80 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
29a90 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e    pLeaf = pCur->
29aa0 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70  pPage;.  pCur->p
29ab0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
29ac0 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67  age[--pCur->iPag
29ad0 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e];.  releasePag
29ae0 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b  eNotNull(pLeaf);
29af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29b00 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
29b10 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
29b20 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
29b30 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
29b40 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
29b50 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
29b60 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
29b70 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
29b80 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
29b90 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
29ba0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
29bb0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
29bc0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
29bd0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
29be0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
29bf0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
29c00 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
29c10 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
29c20 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
29c30 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
29c40 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
29c50 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
29c60 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
29c70 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
29c80 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
29c90 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
29ca0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
29cb0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
29cc0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
29cd0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29ce0 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65  EMPTY. Otherwise
29cf0 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  ,.** the cursor 
29d00 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
29d10 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  to the first cel
29d20 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
29d30 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72   root.** (or vir
29d40 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
29d50 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
29d60 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
29d70 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
29d80 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
29d90 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
29da0 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
29db0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
29dc0 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
29dd0 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
29de0 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
29df0 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
29e00 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
29e10 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
29e20 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
29e30 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
29e40 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
29e50 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
29e60 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
29e70 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
29e80 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
29e90 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
29ea0 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
29eb0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
29ec0 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
29ed0 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
29ee0 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
29ef0 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
29f00 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
29f10 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
29f20 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
29f30 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
29f40 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29f50 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
29f60 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
29f70 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
29f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
29f90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29fa0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29fb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
29fc0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
29fd0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
29fe0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
29ff0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
2a000 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a010 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2a020 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
2a030 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
2a040 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2a050 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c  ( pCur->eState <
2a060 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a070 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  EEK || pCur->iPa
2a080 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge<0 );.  assert
2a090 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2a0a0 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  >0 || pCur->iPag
2a0b0 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  e<0 );..  if( pC
2a0c0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
2a0d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2a0e0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  age ){.      rel
2a0f0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2a100 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2a110 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75      while( --pCu
2a120 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
2a130 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
2a140 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
2a150 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a170 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
2a180 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2a190 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2a1a0 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  init;.    }.  }e
2a1b0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
2a1c0 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
2a1d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2a1e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2a1f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a200 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65  E_EMPTY;.  }else
2a210 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2a220 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20  ur->iPage==(-1) 
2a230 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
2a240 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
2a250 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
2a260 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65       if( pCur->e
2a270 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2a280 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ULT ){.        a
2a290 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2a2a0 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
2a2b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
2a2c0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
2a2d0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2a2e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2a2f0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
2a300 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
2a310 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
2a320 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
2a330 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2a340 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20   &pCur->pPage,. 
2a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a360 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
2a370 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2a380 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2a3a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2a3b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2a3c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2a3d0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
2a3e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
2a3f0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
2a400 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
2a410 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2a420 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2a430 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2a440 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
2a450 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
2a460 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
2a470 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2a480 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
2a490 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
2a4a0 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
2a4b0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
2a4c0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
2a4d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2a4e0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
2a4f0 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
2a500 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
2a510 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
2a520 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
2a530 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
2a540 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
2a550 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
2a560 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
2a570 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
2a580 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
2a590 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
2a5a0 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
2a5b0 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
2a5c0 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
2a5d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2a5e0 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
2a5f0 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
2a600 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
2a610 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
2a620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2a630 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
2a640 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
2a650 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
2a660 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
2a670 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
2a680 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
2a690 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
2a6a0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2a6b0 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
2a6c0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
2a6d0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
2a6e0 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
2a6f0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2a700 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2a710 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a720 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
2a730 4f 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70  O(pCur->pPage->p
2a740 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f  gno);.  }..skip_
2a750 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e  init:  .  pCur->
2a760 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2a770 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2a780 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2a790 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2a7a0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
2a7b0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2a7c0 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  ;..  pRoot = pCu
2a7d0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2a7e0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
2a7f0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2a800 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2a810 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
2a820 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
2a830 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
2a840 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
2a850 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
2a860 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a870 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
2a880 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
2a890 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
2a8a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2a8b0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2a8c0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2a8d0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2a8e0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
2a8f0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
2a900 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2a910 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2a920 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  D;.    rc = SQLI
2a930 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20  TE_EMPTY;.  }.  
2a940 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a950 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a960 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2a970 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2a980 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2a990 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2a9a0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2a9b0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2a9c0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2a9d0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2a9e0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2a9f0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2aa00 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2aa10 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2aa20 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2aa30 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2aa40 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2aa50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2aa60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2aa70 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2aa80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2aa90 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2aaa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2aab0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2aac0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2aad0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2aae0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2aaf0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2ab00 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
2ab10 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
2ab20 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
2ab30 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
2ab40 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2ab50 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72  Cur->ix));.    r
2ab60 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ab70 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
2ab80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ab90 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2aba0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2abb0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
2abc0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2abd0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
2abe0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2abf0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
2ac00 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
2ac10 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
2ac20 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2ac30 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
2ac40 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
2ac50 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
2ac60 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
2ac70 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2ac80 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
2ac90 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
2aca0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
2acb0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2acc0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2acd0 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
2ace0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2acf0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
2ad00 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2ad10 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
2ad20 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
2ad30 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2ad40 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
2ad50 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
2ad60 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2ad70 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2ad80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2ad90 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2ada0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2adb0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2adc0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2add0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ade0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2adf0 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2ae00 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2ae10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2ae20 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2ae30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ae40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ae50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  ;.    pCur->ix =
2ae60 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2ae70 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2ae80 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2ae90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2aea0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
2aeb0 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2aec0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
2aed0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2aee0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
2aef0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2af00 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2af10 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
2af20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2af30 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2af40 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
2af50 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2af60 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2af70 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2af80 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2af90 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2afa0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2afb0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2afc0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2afd0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2afe0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2aff0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b000 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
2b010 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2b020 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
2b030 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b040 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b050 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b070 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2b080 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2b090 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2b0a0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b0b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b0c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b0d0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
2b0e0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2b0f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b100 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2b110 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2b120 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2b130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b140 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b150 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2b160 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2b170 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2b180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b190 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b1a0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2b1b0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2b1c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2b1d0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2b1e0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2b1f0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2b200 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2b210 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2b220 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2b230 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2b240 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2b250 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2b260 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2b270 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2b280 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2b290 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2b2a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b2b0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b2c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2b2d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2b2e0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2b2f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2b300 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2b310 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2b320 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2b330 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2b340 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2b350 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2b360 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2b370 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2b380 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2b390 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2b3a0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2b3b0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2b3c0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2b3d0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2b3e0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2b3f0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2b400 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2b410 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2b420 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2b430 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2b440 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2b450 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2b460 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2b470 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2b480 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2b490 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2b4a0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2b4b0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2b4c0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2b4d0 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2b4e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b4f0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2b500 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2b510 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2b520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2b530 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b540 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b550 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2b560 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b570 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2b580 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b5a0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2b5b0 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2b5c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b5d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b5e0 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2b5f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2b600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2b610 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2b620 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2b630 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2b640 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2b650 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2b660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b670 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2b680 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2b690 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2b6a0 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2b6b0 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2b6c0 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2b6d0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2b6e0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2b6f0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2b700 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2b710 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2b720 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2b730 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2b740 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2b750 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2b760 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2b770 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2b780 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2b790 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2b7a0 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2b7b0 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2b7c0 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2b7d0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2b7e0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2b7f0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2b800 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2b810 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2b820 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2b830 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2b840 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2b850 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2b860 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2b870 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2b880 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2b890 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2b8a0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2b8b0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2b8c0 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2b8d0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2b8e0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2b8f0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2b900 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2b910 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2b920 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2b930 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2b940 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2b950 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2b960 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2b970 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2b990 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2b9a0 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2b9b0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2b9c0 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2b9d0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2b9e0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2b9f0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2ba00 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2ba10 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2ba20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2ba30 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2ba40 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2ba50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2ba60 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2ba70 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2ba80 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2ba90 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2baa0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2bab0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2bac0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2bae0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2baf0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2bb00 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2bb10 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2bb20 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2bb30 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2bb40 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2bb50 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2bb60 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2bb70 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2bb80 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2bb90 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2bba0 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2bbb0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2bbc0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2bbd0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2bbe0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2bbf0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2bc00 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2bc10 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc30 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2bc40 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2bc50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2bc60 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2bc70 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2bc80 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2bc90 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2bca0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2bcb0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2bcc0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2bcd0 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2bce0 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2bcf0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2bd00 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2bd10 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2bd20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bd30 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2bd40 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2bd50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2bd60 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2bd70 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2bd80 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2bd90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2bda0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2bdb0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2bdc0 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2bdd0 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2bde0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2bdf0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2be00 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2be10 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2be20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2be30 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2be40 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2be50 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2be60 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2be70 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2be80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2be90 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2bea0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2beb0 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2bec0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2bed0 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2bee0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2bef0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2bf00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bf10 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2bf20 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2bf30 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2bf40 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2bf50 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2bf60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2bf70 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2bf80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bf90 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2bfa0 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2bfb0 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2bfc0 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2bfd0 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2bfe0 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2bff0 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2c000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c010 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2c020 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2c030 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2c040 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2c050 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2c060 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2c070 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2c080 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2c090 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2c0a0 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2c0b0 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2c0c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2c0d0 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2c0e0 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2c0f0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2c100 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2c110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2c120 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2c130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c150 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c            getCel
2c160 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
2c170 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2c180 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2c190 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2c1a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c1b0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2c1c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c1d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2c1e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
2c1f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c200 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c210 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c220 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2c230 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2c240 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2c250 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2c260 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2c270 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2c280 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2c290 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2c2a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2c2b0 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2c2c0 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2c2d0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2c2e0 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2c2f0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2c300 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2c310 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c320 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2c330 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2c340 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2c350 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2c360 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c370 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2c380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2c390 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73  PTY ){.      ass
2c3a0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2c3b0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2c3c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2c3d0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2c3e0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2c3f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2c400 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2c410 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c420 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2c430 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c440 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2c450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c460 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c470 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2c480 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2c490 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73  Cell > 0 );.  as
2c4a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2c4b0 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  e==0 || pCur->ap
2c4c0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2c4d0 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2c4e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c4f0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2c500 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2c510 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2c520 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2c530 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2c540 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2c550 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2c560 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  ge;.    u8 *pCel
2c570 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2c580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2c590 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2c5a0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2c5b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2c5c0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2c5d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2c5e0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2c5f0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2c600 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2c610 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2c620 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2c630 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2c640 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2c650 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2c660 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2c670 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2c680 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2c690 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2c6a0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2c6b0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2c6c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2c6d0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2c6e0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2c6f0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2c700 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2c710 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2c720 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2c730 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2c740 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2c750 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2c760 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2c770 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2c780 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2c790 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2c7a0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2c7b0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2c7c0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2c7d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2c7e0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2c7f0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2c800 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2c810 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2c820 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2c830 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2c840 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2c850 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2c860 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2c870 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2c880 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2c890 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2c8a0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2c8b0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2c8c0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2c8d0 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2c8e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2c8f0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2c900 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2c910 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2c920 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c930 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2c940 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2c950 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2c960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
2c970 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
2c980 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c9a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2c9b0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2c9c0 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2c9d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2c9e0 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2c9f0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2ca00 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2ca10 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2ca20 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2ca30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ca40 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2ca50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2ca60 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2ca70 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2ca80 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2ca90 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2caa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2cab0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2cac0 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2cad0 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2cae0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2caf0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2cb00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2cb10 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2cb20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2cb30 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2cb40 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2cb50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2cb60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2cb70 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2cb80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2cb90 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2cba0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2cbb0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2cbc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2cbd0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2cbe0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2cbf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cc00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cc10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2cc20 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2cc30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2cc40 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2cc50 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2cc60 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2cc70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2cc80 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2cc90 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2cca0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2ccb0 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2ccc0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2ccd0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2cce0 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2ccf0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2cd00 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2cd10 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2cd20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2cd30 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2cd40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2cd50 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2cd60 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2cd70 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2cd80 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2cd90 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2cda0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2cdb0 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2cdc0 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2cdd0 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2cde0 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2cdf0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2ce00 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2ce10 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2ce20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2ce30 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2ce40 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2ce50 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2ce60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2ce70 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2ce80 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2ce90 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2cea0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2ceb0 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2cec0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2ced0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2cee0 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2cef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2cf00 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2cf10 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2cf20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2cf30 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2cf40 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2cf50 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2cf60 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2cf70 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2cf80 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2cf90 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2cfa0 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2cfb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2cfc0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2cfd0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2cfe0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2cff0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d000 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d010 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d020 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d030 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2d040 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d050 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2d060 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2d070 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2d080 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2d090 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2d0a0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2d0b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d0c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2d0d0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2d0e0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2d0f0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2d100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2d110 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2d120 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2d130 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d140 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2d150 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2d160 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2d170 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d180 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d190 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2d1a0 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2d1b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2d1c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2d1d0 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2d1e0 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2d1f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2d200 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2d210 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2d220 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2d230 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2d240 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2d250 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2d260 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2d270 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2d280 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2d290 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2d2a0 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2d2b0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2d2c0 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2d2d0 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2d2e0 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2d2f0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2d300 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2d310 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2d320 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2d330 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2d340 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2d350 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2d360 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2d370 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2d380 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2d390 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2d3a0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2d3b0 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2d3c0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2d3d0 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2d3e0 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2d3f0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2d400 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2d410 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2d420 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2d430 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2d440 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2d450 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2d460 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2d470 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2d480 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2d490 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2d4a0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2d4b0 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2d4c0 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2d4d0 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2d4e0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2d4f0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2d500 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2d510 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2d520 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2d530 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d540 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2d550 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2d560 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2d570 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2d580 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2d590 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2d5a0 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2d5b0 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2d5c0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2d5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d5e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2d5f0 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
2d600 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
2d610 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2d620 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2d630 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2d640 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2d650 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2d660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2d670 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2d680 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d690 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d6a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2d6b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2d6c0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2d6d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d6e0 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d6f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2d700 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2d710 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2d720 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2d730 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  lKey, 0);.      
2d740 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2d750 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
2d760 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20  dOvfl;.         
2d770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2d780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d790 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2d7a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d7b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2d7c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d7d0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2d7e0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2d7f0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2d800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2d810 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2d820 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2d830 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2d840 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2d850 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2d860 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2d870 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2d880 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2d890 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2d8a0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2d8b0 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2d8c0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2d8d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2d8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2d8f0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2d900 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2d910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2d920 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2d930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d940 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2d950 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2d960 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2d970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d980 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2d990 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2d9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d9b0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2d9c0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2d9d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d9e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d9f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2da00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2da10 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2da20 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2da30 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2da40 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2da50 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2da60 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2da70 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2da80 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2da90 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2daa0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2dab0 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2dac0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2dad0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2dae0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2daf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2db00 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
2db10 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2db20 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20  .      pCur->ix 
2db30 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2db40 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
2db50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2db60 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
2db70 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2db80 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
2db90 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
2dba0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
2dbb0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
2dbc0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2dbd0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2dbe0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2dbf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dc00 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2dc10 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
2dc20 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
2dc30 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2dc40 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
2dc50 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2dc60 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
2dc70 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
2dc80 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
2dc90 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
2dca0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73  nSize = 0;.  ass
2dcb0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2dcc0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2dcd0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72  dOvfl)==0 );.  r
2dce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2dcf0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2dd00 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2dd10 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2dd20 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2dd30 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2dd40 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2dd50 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2dd60 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2dd70 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2dd80 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2dd90 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2dda0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2ddb0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2ddc0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2ddd0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2dde0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2ddf0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2de00 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2de10 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2de20 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2de30 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2de40 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2de50 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2de60 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2de70 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2de80 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2de90 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2dea0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2deb0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2dec0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2ded0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2dee0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2def0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2df00 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2df10 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2df20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
2df30 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20  stimate for the 
2df40 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
2df50 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
2df60 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e   pCur is.** poin
2df70 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e  ting to.  Return
2df80 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2df90 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74  er if no estimat
2dfa0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  e is currently .
2dfb0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f  ** available..*/
2dfc0 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  .i64 sqlite3Btre
2dfd0 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43  eRowCountEst(BtC
2dfe0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2dff0 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a  i64 n;.  u8 i;..
2e000 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2e010 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2e020 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2e030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e040 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2e050 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
2e060 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2e070 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
2e080 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
2e090 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72  the OP_IfSmaller
2e0a0 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e  .  ** opcode, an
2e0b0 64 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74  d it that case t
2e0c0 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61  he cursor will a
2e0d0 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61  lways be valid a
2e0e0 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77  nd.  ** will alw
2e0f0 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c  ays point to a l
2e100 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69  eaf node. */.  i
2e110 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65  f( NEVER(pCur->e
2e120 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2e130 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31  LID) ) return -1
2e140 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43  ;.  if( NEVER(pC
2e150 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
2e160 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  =0) ) return -1;
2e170 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50  ..  n = pCur->pP
2e180 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f  age->nCell;.  fo
2e190 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69  r(i=0; i<pCur->i
2e1a0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2e1b0 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  n *= pCur->apPag
2e1c0 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d  e[i]->nCell;.  }
2e1d0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
2e1e0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2e1f0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2e200 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2e210 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20  e database. .** 
2e220 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a  Return value:.**
2e230 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .**    SQLITE_OK
2e240 20 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a          success.
2e250 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  **    SQLITE_DON
2e260 45 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73  E      cursor is
2e270 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
2e280 67 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c  g at the last el
2e290 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65  ement.**    othe
2e2a0 72 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d  rwise        som
2e2b0 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
2e2c0 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54  occurred.**.** T
2e2d0 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f  he main entry po
2e2e0 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74  int is sqlite3Bt
2e2f0 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74  reeNext().  That
2e300 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2e310 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2e320 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2e330 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74  merely increment
2e340 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
2e350 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
2e360 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65  Idx.** to the ne
2e370 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  xt cell on the c
2e380 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2e390 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2e3a0 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a  Next() helper.**
2e3b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2e3c0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2e3d0 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2e3e0 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2e3f0 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73  age or.** to res
2e400 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2e410 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2e420 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2e430 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42  ment in sqlite3B
2e440 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73  treeNext(C,F) is
2e450 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20   1, then the.** 
2e460 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e  cursor correspon
2e470 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2e480 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ex and this rout
2e490 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2e4a0 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69  een.** skipped i
2e4b0 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20  f the SQL index 
2e4c0 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75  had been a uniqu
2e4d0 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20  e index.  The F 
2e4e0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61  argument.** is a
2e4f0 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
2e500 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20  lement.  SQLite 
2e510 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2e520 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73  tion does not us
2e530 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20  e.** this hint, 
2e540 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
2e550 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
2e560 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
2e570 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2e580 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2e590 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
2e5a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2e5b0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2e5c0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2e5d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2e5e0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e5f0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2e600 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2e610 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
2e620 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2e630 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2e640 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2e650 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2e660 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2e670 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2e680 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2e690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2e6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e6b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e6c0 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2e6d0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2e6e0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2e6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
2e700 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ONE;.    }.    i
2e710 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2e720 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2e730 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2e740 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2e750 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e760 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2e770 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2e780 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2e790 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2e7a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2e7b0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2e7c0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2e7d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e7e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2e7f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2e800 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2e810 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2e820 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2e830 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b  dx = ++pCur->ix;
2e840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2e850 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2e860 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2e870 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2e880 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2e890 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2e8a0 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2e8b0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2e8c0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2e8d0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2e8e0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2e8f0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2e900 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2e910 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2e920 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2e930 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2e940 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2e950 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2e960 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2e970 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2e980 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2e990 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2e9a0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2e9b0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2e9c0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2e9d0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2e9e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2e9f0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2ea00 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2ea10 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2ea20 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2ea30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2ea40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2ea50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2ea60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ea70 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2ea80 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2ea90 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2eaa0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2eab0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2eac0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2ead0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2eae0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2eaf0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2eb00 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2eb10 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2eb20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2eb30 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
2eb40 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d  hile( pCur->ix>=
2eb50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2eb60 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2eb70 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2eb80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2eb90 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2eba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ebb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ebc0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2ebd0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ebe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ebf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ec00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2ec10 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2ec20 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2ec30 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2ec40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2ec50 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50  t flags){.  MemP
2ec60 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e  age *pPage;.  UN
2ec70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
2ec80 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
2ec90 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
2eca0 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
2ecb0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63  e */.  assert( c
2ecc0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ecd0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ece0 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
2ecf0 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
2ed00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2ed10 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2ed20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2ed30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
2ed40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2ed50 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2ed60 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2ed70 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2ed80 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43  dOvfl);.  if( pC
2ed90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2eda0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2edb0 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2edc0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2edd0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2ede0 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
2edf0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2ee00 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
2ee10 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2ee20 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
2ee30 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ee40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ee50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ee60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2ee70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2ee80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ee90 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
2eea0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
2eeb0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
2eec0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2eed0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
2eee0 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
2eef0 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
2ef00 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
2ef10 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
2ef20 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2ef30 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
2ef40 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
2ef50 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
2ef60 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
2ef70 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2ef80 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2ef90 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2efa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2efb0 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2efc0 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2efd0 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2efe0 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2eff0 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2f000 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2f010 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2f020 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2f030 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2f040 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2f050 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2f060 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2f070 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2f080 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2f090 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2f0a0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2f0b0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2f0c0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2f0d0 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
2f0e0 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
2f0f0 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
2f100 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2f110 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
2f120 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
2f130 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2f140 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2f150 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2f160 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2f170 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2f180 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2f190 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2f1a0 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2f1b0 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
2f1c0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2f1d0 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
2f1e0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2f1f0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2f200 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
2f210 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
2f220 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
2f230 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
2f240 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
2f250 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2f260 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2f270 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2f280 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2f290 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2f2a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2f2b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2f2c0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2f2d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2f2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2f2f0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2f300 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2f310 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2f320 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2f330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2f340 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2f350 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2f360 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f370 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2f380 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2f390 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2f3a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f3b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2f3c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2f3d0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2f3e0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2f3f0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2f400 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2f410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2f420 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2f430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2f440 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2f450 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2f460 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f470 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2f480 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f490 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2f4a0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2f4b0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
2f4c0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2f4d0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2f4e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f4f0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2f500 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f510 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2f520 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f530 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2f540 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2f550 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2f560 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
2f570 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a  idx = pCur->ix;.
2f580 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2f590 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2f5a0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2f5b0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
2f5c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f5d0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
2f5e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2f5f0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2f600 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78   while( pCur->ix
2f610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2f620 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2f630 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2f640 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2f650 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2f660 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f670 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
2f680 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2f690 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2f6a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f6b0 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2f6c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2f6d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2f6e0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
2f6f0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
2f700 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67  ->ix--;.    pPag
2f710 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f720 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2f730 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2f740 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2f750 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f760 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2f770 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
2f780 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f790 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2f7a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2f7b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2f7c0 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2f7d0 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
2f7e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2f7f0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2f800 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2f810 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
2f820 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  lags==1 );.  ass
2f830 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2f840 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2f850 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f860 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44  ALID );.  UNUSED
2f870 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
2f880 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
2f890 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
2f8a0 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
2f8b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2f8c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
2f8d0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2f8e0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2f8f0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
2f900 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
2f910 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2f920 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
2f930 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
2f940 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
2f950 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
2f960 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
2f970 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
2f980 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
2f990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f9a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2f9b0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2f9c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2f9d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2f9e0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2f9f0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2fa00 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2fa10 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2fa20 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2fa30 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2fa40 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2fa50 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2fa60 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2fa70 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2fa80 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2fa90 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2faa0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2fab0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2fac0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2fad0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2fae0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2faf0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2fb00 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2fb10 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2fb20 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2fb30 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2fb40 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2fb50 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2fb60 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2fb70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2fb80 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2fb90 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2fba0 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2fbb0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2fbc0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2fbd0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2fbe0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2fbf0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2fc00 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2fc10 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2fc20 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2fc30 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2fc40 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2fc50 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2fc60 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2fc70 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2fc80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2fc90 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2fca0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2fcb0 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2fcc0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2fcd0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2fce0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2fcf0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2fd00 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2fd10 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2fd20 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2fd30 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2fd40 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2fd50 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2fd60 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2fd70 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2fd80 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2fd90 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2fda0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2fdb0 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2fdc0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2fdd0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2fde0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2fdf0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2fe00 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2fe10 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2fe20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2fe30 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2fe40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2fe50 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2fe60 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2fe70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2fe80 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2fe90 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2fea0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2feb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2fec0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2fed0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2fee0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2fef0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2ff00 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2ff10 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2ff20 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2ff30 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2ff40 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2ff50 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2ff60 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2ff70 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2ff80 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2ff90 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2ffa0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2ffb0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2ffc0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2ffd0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2ffe0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2fff0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
30000 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
30010 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
30020 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
30030 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30040 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
30050 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
30060 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
30070 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
30080 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
30090 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
300a0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
300b0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
300c0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
300d0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
300e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
300f0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
30100 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
30110 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
30120 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
30130 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
30140 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
30150 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
30160 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
30170 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
30180 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
30190 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
301a0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
301b0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
301c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
301d0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
301e0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
301f0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
30200 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
30210 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
30220 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
30230 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
30240 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
30250 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
30260 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
30270 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
30280 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
30290 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
302a0 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
302b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
302c0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
302d0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
302e0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
302f0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
30300 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
30310 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
30320 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
30330 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
30340 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
30350 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
30360 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
30370 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
30380 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
30390 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
303a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
303b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
303c0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
303d0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
303e0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
303f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
30400 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
30410 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
30420 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
30430 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
30440 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
30450 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
30460 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
30470 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
30480 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
304a0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
304b0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
304c0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
304d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
304e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
304f0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
30500 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
30510 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
30520 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
30530 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
30540 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
30550 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
30560 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
30570 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
30580 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
30590 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
305a0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
305b0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
305c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
305d0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
305e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
305f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30600 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
30610 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
30620 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
30630 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
30640 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
30650 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
30660 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
30670 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
30680 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
30690 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
306a0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
306b0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
306c0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
306d0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
306e0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
306f0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
30700 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
30710 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
30720 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
30730 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
30740 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
30750 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
30760 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
30770 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
30780 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
30790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
307a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
307b0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
307c0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
307d0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
307e0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
307f0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
30800 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
30810 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
30820 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
30830 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
30840 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
30850 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
30860 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
30870 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
30880 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
30890 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
308a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
308b0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
308c0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
308d0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
308e0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
308f0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
30900 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
30910 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30920 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
30930 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
30940 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
30950 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
30960 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
30970 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
30980 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
30990 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
309a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
309b0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
309c0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
309d0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
309e0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
309f0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
30a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
30a10 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
30a20 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
30a30 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
30a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30a50 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30a60 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
30a70 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
30a80 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
30a90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
30aa0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
30ab0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
30ac0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
30ae0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
30af0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30b00 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
30b10 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
30b20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
30b30 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
30b40 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
30b50 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
30b60 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
30b70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
30b80 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
30b90 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
30ba0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
30bb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
30bc0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
30bd0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
30be0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
30bf0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
30c00 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
30c10 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
30c20 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
30c30 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
30c40 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
30c50 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
30c60 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
30c70 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
30c80 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
30c90 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
30ca0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
30cb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
30cc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30cd0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
30ce0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
30cf0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
30d00 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
30d10 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
30d20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
30d30 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
30d40 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
30d50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
30d60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
30d70 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
30d80 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
30d90 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
30da0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
30db0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30dc0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
30dd0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
30de0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
30df0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
30e00 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
30e10 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
30e20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
30e30 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
30e40 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
30e50 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
30e60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30e70 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
30e80 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
30e90 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30ea0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
30eb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
30ec0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
30ed0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
30ee0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
30ef0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
30f00 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
30f10 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
30f20 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
30f30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
30f40 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
30f50 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
30f60 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
30f70 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
30f80 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
30f90 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
30fa0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
30fb0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
30fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
30fd0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
30fe0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
30ff0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
31000 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
31010 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31020 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
31030 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31040 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
31050 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
31060 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31070 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
31080 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
31090 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
310a0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
310b0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
310c0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
310d0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
310e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
310f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
31100 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31110 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
31120 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
31130 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31140 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31160 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31170 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31190 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
311a0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
311b0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
311c0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
311d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
311e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
311f0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
31200 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
31210 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
31220 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
31230 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
31240 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
31250 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
31260 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
31270 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
31280 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
31290 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
312a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
312b0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
312c0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
312d0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
312e0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
312f0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
31300 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
31310 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
31320 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31330 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31340 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
31350 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
31360 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
31370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31380 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
31390 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
313a0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
313b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
313c0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
313d0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
313e0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
313f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31410 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31420 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31450 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
31460 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
31470 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31490 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
314a0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
314b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
314c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
314d0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
314e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
314f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
31500 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
31510 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
31520 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
31530 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
31540 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
31550 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
31560 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
31570 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
31580 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
31590 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
315a0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
315b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
315c0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
315d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
315e0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
315f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
31600 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
31610 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
31620 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31630 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
31640 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
31670 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
31680 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
31690 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
316a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
316b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
316c0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
316d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
316e0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
316f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
31700 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
31710 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
31720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31730 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
31740 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
31750 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
31760 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
31770 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
31780 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
31790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
317a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
317b0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
317c0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
317d0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
317e0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
317f0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
31800 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31810 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
31820 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
31830 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
31840 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
31850 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
31860 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
31870 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
31880 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
31890 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
318a0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
318b0 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
318c0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
318d0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
318e0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
318f0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
31910 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
31920 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
31930 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
31940 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31950 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
31960 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
31970 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
31980 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
31990 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
319a0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
319b0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
319c0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
319d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
319e0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
319f0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
31a00 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
31a10 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
31a20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31a30 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
31a50 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
31a60 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
31a70 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
31a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
31aa0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
31ab0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
31ac0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
31ad0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
31ae0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
31af0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
31b00 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
31b10 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
31b20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
31b30 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
31b40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31b50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
31b60 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
31b70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
31b80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
31b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31ba0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
31bb0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
31bc0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
31bd0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
31be0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
31bf0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
31c00 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
31c10 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
31c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31c30 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
31c40 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
31c50 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
31c60 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
31c70 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
31c80 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
31c90 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
31ca0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
31cb0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
31ce0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
31cf0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
31d00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31d10 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
31d20 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31d30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
31d40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
31d50 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
31d60 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
31d70 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
31d80 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
31d90 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
31da0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
31db0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31dc0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
31dd0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
31de0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
31df0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
31e00 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
31e10 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
31e20 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
31e30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31e40 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31e50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
31e60 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
31e70 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
31e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31eb0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
31ec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
31ed0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
31ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31ef0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
31f00 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
31f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
31f20 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
31f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31f50 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
31f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31f70 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
31f80 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
31f90 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
31fa0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
31fb0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
31fc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
31fd0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
31fe0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
31ff0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
32000 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
32010 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
32020 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
32030 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
32040 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
32050 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
32060 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
32070 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
32080 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
32090 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
320a0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
320b0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
320c0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
320d0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
320e0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
320f0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
32100 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
32110 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
32120 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
32130 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
32140 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
32150 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
32160 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
32170 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
32180 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
32190 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
321a0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
321b0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
321c0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
321d0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
321e0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
321f0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
32200 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
32210 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
32220 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
32230 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
32240 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
32250 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
32260 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
32270 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
32280 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
32290 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
322a0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
322b0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
322c0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
322d0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
322e0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
322f0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
32300 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
32310 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
32320 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
32330 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
32340 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
32350 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
32360 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
32370 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
32380 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
32390 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
323a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
323b0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
323c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
323d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
323e0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
323f0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
32400 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
32410 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
32420 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
32430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32440 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
32450 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
32460 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32470 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
32480 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
32490 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
324a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
324b0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
324c0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
324d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
324e0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
324f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
32500 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
32510 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
32520 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
32530 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
32540 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
32550 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
32560 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
32570 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
32580 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
32590 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
325a0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
325b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
325c0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
325d0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
325e0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
325f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
32600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
32610 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
32620 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
32630 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
32640 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
32650 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
32660 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
32670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
32680 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
32690 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
326a0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
326b0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
326c0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
326d0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
326e0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
326f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32700 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
32710 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32720 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
32730 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32740 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
32750 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
32760 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32770 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
32780 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
32790 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
327a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
327b0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
327c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
327d0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
327e0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
327f0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
32800 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
32810 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
32820 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
32830 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
32840 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
32850 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
32860 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
32870 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
32880 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
32890 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
328a0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
328b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
328c0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
328d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
328e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
328f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
32900 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
32910 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
32920 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
32930 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
32940 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
32950 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
32960 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
32970 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
32980 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
32990 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
329a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
329b0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
329c0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
329d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
329e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
329f0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
32a00 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
32a10 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
32a20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
32a30 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
32a40 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
32a50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
32a70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
32a80 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
32a90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
32aa0 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
32ab0 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
32ac0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
32ad0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
32ae0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
32af0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
32b00 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
32b10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
32b20 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
32b30 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
32b40 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
32b50 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
32b60 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
32b70 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
32b80 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
32b90 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
32ba0 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
32bb0 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
32bc0 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
32bd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
32be0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
32bf0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
32c00 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
32c10 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
32c20 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
32c30 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
32c40 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
32c50 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
32c60 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
32c70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
32c80 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
32c90 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
32ca0 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
32cb0 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
32cc0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
32cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ce0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
32cf0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
32d00 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32d20 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
32d30 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
32d40 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
32d50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
32d60 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
32d70 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
32d80 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
32d90 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32db0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
32dc0 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
32dd0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
32de0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
32e10 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
32e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
32e40 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
32e50 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
32e60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
32e70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32e80 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
32e90 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
32ea0 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
32eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
32ec0 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
32ed0 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
32ee0 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
32ef0 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
32f00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32f10 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
32f20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
32f30 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
32f40 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
32f50 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32f60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
32f70 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
32f80 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
32f90 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
32fa0 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
32fb0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
32fc0 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
32fd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
32fe0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
32ff0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
33000 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33010 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
33020 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33030 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
33040 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33050 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
33060 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
33070 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
33080 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
33090 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
330a0 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
330b0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
330c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
330d0 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
330e0 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
330f0 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
33100 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
33110 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
33120 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33130 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
33140 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
33150 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
33160 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33170 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
33180 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
33190 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
331a0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
331b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
331c0 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
331d0 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
331e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
331f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
33200 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
33210 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
33220 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
33230 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
33240 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
33250 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
33260 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
33270 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
33280 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
33290 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
332a0 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
332b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
332c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
332d0 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
332e0 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
332f0 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
33300 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
33310 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
33320 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
33330 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
33340 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
33350 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
33360 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
33370 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
33380 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
33390 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
333a0 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
333b0 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
333c0 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
333d0 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
333e0 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
333f0 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
33400 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
33410 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
33420 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
33430 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
33440 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
33450 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
33460 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
33470 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
33480 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
33490 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
334a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
334b0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
334c0 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
334d0 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
334e0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
334f0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33500 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
33510 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
33520 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
33530 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
33540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33550 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
33560 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
33570 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
33580 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
33590 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
335a0 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
335b0 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
335c0 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
335d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
335e0 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
335f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33600 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
33610 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33620 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33630 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
33640 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
33650 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
33660 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
33670 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
33680 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
33690 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
336a0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
336b0 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
336c0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
336d0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
336e0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
336f0 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
33700 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
33710 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
33720 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
33730 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
33740 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
33750 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
33760 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
33770 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
33780 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
33790 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
337a0 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
337b0 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
337c0 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
337d0 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
337e0 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
337f0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
33800 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
33810 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
33820 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
33830 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
33840 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
33850 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
33860 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
33870 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
33880 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
33890 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
338a0 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
338b0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
338c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
338d0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
338e0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
338f0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
33900 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
33910 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
33920 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
33930 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
33940 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
33950 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
33960 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
33970 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
33980 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
33990 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
339a0 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
339b0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
339c0 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
339d0 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
339e0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
339f0 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
33a00 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
33a10 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
33a20 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
33a30 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
33a40 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
33a50 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
33a60 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
33a70 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
33a80 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33a90 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
33aa0 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
33ab0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
33ac0 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
33ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33ae0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
33af0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33b00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33b10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
33b20 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
33b30 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
33b40 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
33b50 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
33b60 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
33b70 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
33b80 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
33b90 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
33ba0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
33bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
33bc0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
33bd0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
33be0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
33bf0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
33c00 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
33c10 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
33c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
33c30 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
33c40 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
33c50 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
33c60 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
33c70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
33c80 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33c90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
33ca0 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
33cb0 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
33cc0 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
33cd0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
33ce0 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
33cf0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
33d00 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
33d10 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
33d20 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
33d30 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
33d40 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
33d50 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
33d60 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
33d70 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
33d80 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
33d90 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
33da0 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
33db0 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
33dc0 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
33dd0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
33de0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
33df0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
33e00 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
33e10 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
33e20 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
33e30 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
33e40 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
33e50 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
33e60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
33e70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33e80 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
33e90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
33ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33eb0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
33ec0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
33ed0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
33ee0 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
33ef0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
33f00 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
33f10 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
33f20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
33f30 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
33f40 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
33f50 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
33f60 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
33f70 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
33f80 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
33f90 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
33fa0 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
33fb0 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
33fc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
33fd0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
33fe0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
33ff0 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
34000 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
34010 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
34020 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
34030 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
34040 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
34050 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
34060 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
34070 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
34080 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
34090 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
340a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
340b0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
340c0 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
340d0 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
340e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
340f0 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
34100 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
34110 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
34120 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
34130 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
34140 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
34150 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
34160 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
34170 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
34180 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
34190 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
341a0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
341b0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43   the Cell */.  C
341c0 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
341d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
341e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
341f0 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b  t the cell */.){
34200 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34210 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
34220 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
34230 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
34240 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
34250 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
34260 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
34270 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
34280 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
34290 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
342a0 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66  ll, pInfo);.  if
342b0 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d  ( pInfo->nLocal=
342c0 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  =pInfo->nPayload
342d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
342e0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
342f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
34300 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34310 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
34320 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
34330 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31  l+pInfo->nSize-1
34340 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
34350 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
34360 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65  ){.    /* Cell e
34370 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
34380 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  of page */.    r
34390 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
343a0 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d  RUPT_PGNO(pPage-
343b0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 6f 76  >pgno);.  }.  ov
343c0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
343d0 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d  e(pCell + pInfo-
343e0 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70  >nSize - 4);.  p
343f0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
34400 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
34410 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
34420 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
34430 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
34440 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
34450 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  = (pInfo->nPaylo
34460 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  ad - pInfo->nLoc
34470 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
34480 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
34490 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
344a0 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28  Ovfl>0 || .    (
344b0 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70  CORRUPT_DB && (p
344c0 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b  Info->nPayload +
344d0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
344e0 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
344f0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
34500 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
34510 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
34520 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
34530 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
34540 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
34550 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
34560 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
34570 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
34580 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
34590 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
345a0 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
345b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
345c0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
345d0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
345e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
345f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
34600 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
34610 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
34620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34630 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
34650 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
34660 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
34670 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
34680 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
34690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
346a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
346b0 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
346c0 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
346d0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
346e0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
346f0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
34700 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
34710 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
34720 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
34730 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
34740 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
34750 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
34760 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
34770 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
34780 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
34790 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
347a0 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
347b0 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
347c0 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
347d0 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
347e0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
347f0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
34800 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
34810 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
34820 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
34830 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
34840 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
34850 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
34860 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
34870 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
34880 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
34890 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
348a0 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
348b0 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
348c0 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
348d0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
348e0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
348f0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
34900 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
34910 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
34920 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
34930 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
34940 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
34950 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
34960 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
34970 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
34980 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
34990 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
349a0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
349b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
349c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
349d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
349e0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
349f0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
34a00 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
34a10 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
34a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34a30 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
34a40 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
34a50 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
34a60 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
34a70 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
34a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34a90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
34aa0 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
34ab0 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
34ac0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
34ad0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
34ae0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
34af0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
34b00 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
34b10 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
34b20 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
34b30 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
34b40 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
34b50 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
34b60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
34b70 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
34b80 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
34b90 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
34ba0 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
34bb0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
34bc0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
34bd0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
34be0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
34bf0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
34c00 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
34c10 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
34c20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
34c30 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
34c40 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
34c50 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
34c60 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
34c70 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
34c80 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
34c90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
34ca0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
34cb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34cd0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
34ce0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
34cf0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
34d00 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
34d10 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
34d20 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
34d30 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72  l */.  const Btr
34d40 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20  eePayload *pX,  
34d50 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64        /* Payload
34d60 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63   with which to c
34d70 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c  onstruct the cel
34d80 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  l */.  int *pnSi
34d90 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
34da0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
34db0 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
34dc0 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
34dd0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
34de0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
34df0 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69  , n, rc, mn;.  i
34e00 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
34e10 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
34e20 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ase;.  unsigned 
34e30 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
34e40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
34e50 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
34e60 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f  red *pBt;.  Pgno
34e70 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74   pgnoOvfl;.  int
34e80 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73 73   nHeader;..  ass
34e90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
34ea0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
34eb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
34ec0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
34ed0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
34ee0 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
34ef0 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
34f00 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
34f10 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
34f20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
34f30 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
34f40 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
34f50 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
34f60 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
34f70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
34f80 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
34f90 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34fb0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34fc0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
34fd0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
34fe0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
34ff0 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c  er = pPage->chil
35000 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  dPtrSize;.  if( 
35010 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
35020 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
35030 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e  pX->nData + pX->
35040 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20  nZero;.    pSrc 
35050 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20  = pX->pData;.   
35060 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74   nSrc = pX->nDat
35070 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
35080 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
35090 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c   ); /* fillInCel
350a0 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  l() only called 
350b0 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20  for leaves */.  
350c0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
350d0 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
350e0 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
350f0 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  ad);.    nHeader
35100 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
35110 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
35120 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29  (u64*)&pX->nKey)
35130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35140 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c  ssert( pX->nKey<
35150 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
35160 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  X->pKey!=0 );.  
35170 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61    nSrc = nPayloa
35180 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65  d = (int)pX->nKe
35190 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58  y;.    pSrc = pX
351a0 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61  ->pKey;.    nHea
351b0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
351c0 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  32(&pCell[nHeade
351d0 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  r], nPayload);. 
351e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20   }.  .  /* Fill 
351f0 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
35200 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  /.  pPayload = &
35210 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
35220 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
35230 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
35240 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
35250 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
35260 65 20 77 68 65 72 65 20 65 76 65 72 79 74 68 69  e where everythi
35270 6e 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20 62  ng fits on the b
35280 74 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a 2a  tree page.    **
35290 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77   and no overflow
352a0 20 70 61 67 65 73 20 61 72 65 20 72 65 71 75 69   pages are requi
352b0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20  red. */.    n = 
352c0 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f  nHeader + nPaylo
352d0 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ad;.    testcase
352e0 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65  ( n==3 );.    te
352f0 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a  stcase( n==4 );.
35300 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20      if( n<4 ) n 
35310 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = 4;.    *pnSize
35320 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   = n;.    assert
35330 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64  ( nSrc<=nPayload
35340 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
35350 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20  ( nSrc<nPayload 
35360 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
35370 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53  ayload, pSrc, nS
35380 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  rc);.    memset(
35390 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30  pPayload+nSrc, 0
353a0 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29  , nPayload-nSrc)
353b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
353c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
353d0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
353e0 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61  is point, it mea
353f0 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66 20  ns that some of 
35400 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  the content will
35410 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70   need.  ** to sp
35420 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill onto overflo
35430 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
35440 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  mn = pPage->minL
35450 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b  ocal;.  n = mn +
35460 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
35470 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
35480 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
35490 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
354a0 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
354b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
354c0 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
354d0 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e  l+1 );.  if( n >
354e0 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
354f0 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61   ) n = mn;.  spa
35500 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70  ceLeft = n;.  *p
35510 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61  nSize = n + nHea
35520 64 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f  der + 4;.  pPrio
35530 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
35540 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65  er+n];.  pToRele
35550 61 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f  ase = 0;.  pgnoO
35560 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d  vfl = 0;.  pBt =
35570 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
35580 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
35590 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
355a0 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
355b0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
355c0 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
355d0 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
355e0 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
355f0 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
35600 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
35610 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
35620 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
35630 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
35640 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
35650 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
35660 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
35670 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
35680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
35690 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
356a0 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
356b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
356c0 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
356d0 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
356e0 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
356f0 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
35700 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
35710 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
35720 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
35730 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
35740 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
35750 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
35760 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
35770 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
35780 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
35790 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
357a0 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
357b0 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
357c0 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64  ectly..  */.#ifd
357d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
357e0 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f    {.    CellInfo
357f0 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65   info;.    pPage
35800 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
35810 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
35820 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
35830 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e  Header==(int)(in
35840 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
35850 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
35860 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70  rt( info.nKey==p
35870 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  X->nKey );.    a
35880 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
35890 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
358a0 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
358b0 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
358c0 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ocal );.  }.#end
358d0 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
358e0 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
358f0 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
35900 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
35910 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
35920 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
35930 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  {.    n = nPaylo
35940 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
35950 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
35960 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a  aceLeft;..    /*
35970 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
35980 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
35990 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20  pPayload points 
359a0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
359b0 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  ea.    ** of pTo
359c0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
359d0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
359e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
359f0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
35a00 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
35a10 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35a20 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
35a30 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
35a40 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50  );..    /* If pP
35a50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f  ayload is part o
35a60 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
35a70 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
35a80 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
35a90 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
35aa0 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
35ab0 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64  assert( pPayload
35ac0 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
35ad0 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67   pPayload>=&pPag
35ae0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
35af0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
35b00 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
35b10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35b20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35b30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e  ;..    if( nSrc>
35b40 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =n ){.      memc
35b50 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
35b60 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
35b70 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
35b80 20 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20       n = nSrc;. 
35b90 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79       memcpy(pPay
35ba0 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a  load, pSrc, n);.
35bb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35bc0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
35bd0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , 0, n);.    }. 
35be0 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e     nPayload -= n
35bf0 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c 6f  ;.    if( nPaylo
35c00 61 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ad<=0 ) break;. 
35c10 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
35c20 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
35c30 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
35c40 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
35c50 20 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61 63   n;.    if( spac
35c60 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eLeft==0 ){.    
35c70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
35c80 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
35c90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35ca0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
35cb0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
35cc0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
35cd0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
35ce0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
35cf0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
35d00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
35d10 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
35d20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
35d30 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
35d40 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
35d50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
35d60 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
35d70 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
35d80 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
35d90 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
35da0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
35db0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
35dc0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
35dd0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
35de0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
35df0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35e00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
35e10 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
35e20 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
35e30 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
35e40 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
35e50 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
35e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
35e70 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
35e80 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
35e90 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
35ea0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
35eb0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
35ec0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
35ed0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
35ee0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
35ef0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
35f00 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
35f10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
35f20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
35f30 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
35f40 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
35f50 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
35f60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
35f70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
35f80 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
35f90 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
35fa0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
35fb0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
35fc0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
35fd0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
35fe0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
35ff0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
36000 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
36010 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
36020 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
36030 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
36040 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
36050 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
36060 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
36070 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
36080 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
36090 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
360a0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
360b0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
360c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
360d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
360e0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
360f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36100 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
36110 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36120 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
36130 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
36140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36150 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
36160 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
36170 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
36180 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
36190 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
361a0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
361b0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
361c0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
361d0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
361e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
361f0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
36200 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
36210 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
36220 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
36230 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
36240 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
36250 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
36260 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
36270 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
36280 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
36290 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
362a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
362b0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
362c0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
362d0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
362e0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
362f0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
36300 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36310 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
36320 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
36330 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
36340 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
36350 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
36360 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
36370 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
36380 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
36390 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
363a0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
363b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
363c0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
363d0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
363e0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
363f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
36400 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
36410 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
36420 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
36430 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
36440 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
36450 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
36460 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36470 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
36480 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
36490 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
364a0 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
364b0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
364c0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
364d0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
364e0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
364f0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
36500 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
36510 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
36520 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
36530 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
36540 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
36550 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
36560 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
36570 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
36580 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
36590 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
365a0 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
365b0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
365c0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
365d0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
365e0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
365f0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
36600 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
36610 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
36620 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
36630 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
36640 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
36650 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
36660 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
36670 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
36680 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
36690 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
366a0 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
366b0 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
366c0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
366d0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
366e0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
366f0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
36700 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
36710 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36720 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a  CORRUPT_DB || sz
36730 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
36740 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
36750 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36760 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36770 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
36780 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36790 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
367a0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
367b0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
367c0 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
367d0 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
367e0 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
367f0 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
36800 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
36810 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
36820 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
36830 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
36840 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
36850 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
36860 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36870 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70  .  if( pc+sz > p
36880 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36890 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
368a0 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
368b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
368c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
368d0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
368e0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
368f0 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
36900 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
36910 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43  .  }.  pPage->nC
36920 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61  ell--;.  if( pPa
36930 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
36940 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
36950 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
36960 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
36970 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74  = 0;.    put2byt
36980 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
36990 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
369a0 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  leSize);.    pPa
369b0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
369c0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
369d0 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f  ze - pPage->hdrO
369e0 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  ffset.          
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70               - p
36a00 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
36a10 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b  ze - 8;.  }else{
36a20 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72  .    memmove(ptr
36a30 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67  , ptr+2, 2*(pPag
36a40 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29  e->nCell - idx))
36a50 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
36a60 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
36a70 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20  ge->nCell);.    
36a80 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
36a90 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2;.  }.}../*.** 
36aa0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
36ab0 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
36ac0 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
36ad0 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
36ae0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
36af0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
36b00 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
36b10 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
36b20 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
36b30 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
36b40 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
36b50 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
36b60 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
36b70 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
36b80 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
36b90 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
36ba0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
36bb0 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
36bc0 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
36bd0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20  pPage->apOvfl[] 
36be0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
36bf0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
36c00 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
36c10 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
36c20 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
36c30 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
36c40 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
36c50 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
36c60 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
36c70 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
36c80 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
36c90 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
36ca0 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
36cb0 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53 51   *pRC must be SQ
36cc0 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69  LITE_OK when thi
36cd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
36ce0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
36cf0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
36d00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
36d10 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
36d20 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
36d30 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
36d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
36d50 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
36d60 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
36d70 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
36d80 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
36d90 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
36da0 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
36db0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
36dc0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
36dd0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
36de0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
36df0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
36e00 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
36e10 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
36e20 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
36e30 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
36e40 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
36e50 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
36e60 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
36e70 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
36e80 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
36e90 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
36ea0 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
36eb0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
36ec0 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
36ed0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
36ee0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
36ef0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
36f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
36f10 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
36f20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
36f30 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
36f40 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
36f50 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
36f60 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
36f70 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
36f80 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
36f90 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
36fa0 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  rted */..  asser
36fb0 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f  t( *pRC==SQLITE_
36fc0 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OK );.  assert( 
36fd0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
36fe0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
36ff0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
37000 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50  sert( MX_CELL(pP
37010 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
37020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37030 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
37040 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
37050 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
37060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37070 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
37080 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
37090 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
370a0 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
370b0 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
370c0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
370d0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
370e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
370f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
37100 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
37110 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
37120 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
37130 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
37140 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
37150 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
37160 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
37170 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
37180 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
37190 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
371a0 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
371b0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
371c0 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
371d0 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
371e0 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
371f0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
37200 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
37210 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
37220 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
37230 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
37240 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
37250 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
37260 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
37270 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
37280 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  ==pPage->xCellSi
37290 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ze(pPage, pCell)
372a0 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
372b0 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
372c0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
372d0 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
372e0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
372f0 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
37300 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70   memcpy(pTemp, p
37310 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20  Cell, sz);.     
37320 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
37330 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
37340 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
37350 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
37360 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
37370 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
37380 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20  rflow++;.    /* 
37390 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  Comparison again
373a0 73 74 20 41 72 72 61 79 53 69 7a 65 2d 31 20 73  st ArraySize-1 s
373b0 69 6e 63 65 20 77 65 20 68 6f 6c 64 20 62 61 63  ince we hold bac
373c0 6b 20 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f 74  k one extra slot
373d0 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e  .    ** as a con
373e0 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74  tingency.  In ot
373f0 68 65 72 20 77 6f 72 64 73 2c 20 6e 65 76 65 72  her words, never
37400 20 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20   need more than 
37410 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  3 overflow.    *
37420 2a 20 73 6c 6f 74 73 20 62 75 74 20 34 20 61 72  * slots but 4 ar
37430 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73  e allocated, jus
37440 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f  t to be safe. */
37450 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 20 3c  .    assert( j <
37460 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65   ArraySize(pPage
37470 2d 3e 61 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20  ->apOvfl)-1 );. 
37480 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c     pPage->apOvfl
37490 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  [j] = pCell;.   
374a0 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a   pPage->aiOvfl[j
374b0 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20  ] = (u16)i;..   
374c0 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c   /* When multipl
374d0 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75  e overflows occu
374e0 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77 61  r, they are alwa
374f0 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e  ys sequential an
37500 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74  d in.    ** sort
37510 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ed order.  This 
37520 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73 65  invariants arise
37530 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c   because multipl
37540 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a  e overflows can.
37550 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75      ** only occu
37560 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  r when inserting
37570 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
37580 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
37590 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a  age during.    *
375a0 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64  * balancing, and
375b0 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61 72   the dividers ar
375c0 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73  e adjacent and s
375d0 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  orted..    */.  
375e0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c    assert( j==0 |
375f0 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b  | pPage->aiOvfl[
37600 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f  j-1]<(u16)i ); /
37610 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73  * Overflows in s
37620 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20  orted order */. 
37630 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
37640 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f  || i==pPage->aiO
37650 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20  vfl[j-1]+1 );   
37660 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65  /* Overflows are
37670 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20   sequential */. 
37680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
37690 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
376a0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
376b0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
376c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
376d0 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
376e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
376f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
37700 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37710 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
37720 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
37730 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
37740 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
37750 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  ( &data[pPage->c
37760 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67  ellOffset]==pPag
37770 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20  e->aCellIdx );. 
37780 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
37790 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
377a0 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
377b0 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
377c0 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
377d0 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
377e0 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
377f0 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
37800 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65  lowing propertie
37810 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
37820 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
37830 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  lly */.    asser
37840 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20  t( idx >= 0 );. 
37850 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e     assert( idx >
37860 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
37870 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  set+2*pPage->nCe
37880 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll+2 || CORRUPT_
37890 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
378a0 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74  ( idx+sz <= (int
378b0 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
378c0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
378d0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
378e0 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
378f0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
37900 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b  dx], pCell, sz);
37910 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
37920 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
37930 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
37940 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
37950 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61   pIns = pPage->a
37960 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20  CellIdx + i*2;. 
37970 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b     memmove(pIns+
37980 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67  2, pIns, 2*(pPag
37990 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a  e->nCell - i));.
379a0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 49 6e      put2byte(pIn
379b0 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61  s, idx);.    pPa
379c0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
379d0 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   /* increment th
379e0 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a  e cell count */.
379f0 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b      if( (++data[
37a00 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37a10 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70  +4])==0 ) data[p
37a20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
37a30 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  3]++;.    assert
37a40 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
37a50 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37a60 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43  t+3])==pPage->nC
37a70 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell );.#ifndef S
37a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
37a90 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
37aa0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
37ab0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
37ac0 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
37ad0 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
37ae0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
37af0 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
37b00 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
37b10 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
37b20 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
37b30 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
37b40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37b50 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
37b60 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
37b70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
37b80 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
37b90 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63   CellArray objec
37ba0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63  t contains a cac
37bb0 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61  he of pointers a
37bc0 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a  nd sizes for a.*
37bd0 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65  * consecutive se
37be0 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20  quence of cells 
37bf0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68 65  that might be he
37c00 6c 64 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ld on multiple p
37c10 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ages..*/.typedef
37c20 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61   struct CellArra
37c30 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72  y CellArray;.str
37c40 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a  uct CellArray {.
37c50 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
37c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
37c70 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
37c80 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65  apCell[] */.  Me
37c90 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20  mPage *pRef;    
37ca0 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
37cb0 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ce page */.  u8 
37cc0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
37cd0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
37ce0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
37cf0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
37d00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
37d10 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
37d20 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
37d30 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ll[] */.};../*.*
37d40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
37d50 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64  cell sizes at id
37d60 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69  x, idx+1, ..., i
37d70 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e  dx+N-1 have been
37d80 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  .** computed..*/
37d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70  .static void pop
37da0 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43  ulateCellCache(C
37db0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
37dc0 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20   idx, int N){.  
37dd0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
37de0 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c  & idx+N<=p->nCel
37df0 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e  l );.  while( N>
37e00 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
37e10 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21   p->apCell[idx]!
37e20 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
37e30 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20  >szCell[idx]==0 
37e40 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65  ){.      p->szCe
37e50 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65  ll[idx] = p->pRe
37e60 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
37e70 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
37e80 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  idx]);.    }else
37e90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
37ea0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20  CORRUPT_DB ||.  
37eb0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73              p->s
37ec0 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70  zCell[idx]==p->p
37ed0 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
37ee0 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
37ef0 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d  l[idx]) );.    }
37f00 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20  .    idx++;.    
37f10 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  N--;.  }.}../*.*
37f20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
37f30 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65  e of the Nth ele
37f40 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  ment of the cell
37f50 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63   array.*/.static
37f60 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
37f70 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c   u16 computeCell
37f80 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
37f90 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
37fa0 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
37fb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
37fc0 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  ert( p->szCell[N
37fd0 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43  ]==0 );.  p->szC
37fe0 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66  ell[N] = p->pRef
37ff0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
38000 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e  Ref, p->apCell[N
38010 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ]);.  return p->
38020 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61  szCell[N];.}.sta
38030 74 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65  tic u16 cachedCe
38040 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
38050 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
38060 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
38070 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  <p->nCell );.  i
38080 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20  f( p->szCell[N] 
38090 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65  ) return p->szCe
380a0 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20  ll[N];.  return 
380b0 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
380c0 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, N);.}../*.** 
380d0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
380e0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
380f0 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65   to nCell b-tree
38100 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65   page cells. The
38110 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72   .** szCell[] ar
38120 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ray contains the
38130 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
38140 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69  f each cell. Thi
38150 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
38160 70 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65  places the curre
38170 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  nt contents of p
38180 61 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65  age pPg with the
38190 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
381a0 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a   cell.** array..
381b0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68  **.** Some of th
381c0 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  e cells in apCel
381d0 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c  l[] may currentl
381e0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
381f0 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  Pg. This.** func
38200 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e  tion works aroun
38210 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
38220 64 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b  d by this by mak
38230 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ing a copy of an
38240 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73  y .** such cells
38250 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
38260 69 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74  ing the page dat
38270 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d  a..**.** The Mem
38280 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64  Page.nFree field
38290 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20   is invalidated 
382a0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
382b0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
382c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
382d0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
382e0 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79  set it correctly
382f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
38300 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d  rebuildPage(.  M
38310 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
38320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38330 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65  * Edit this page
38340 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
38350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38360 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
38370 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
38380 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
38390 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
383a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
383b0 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
383c0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
383d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383e0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
383f0 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
38400 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
38410 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
38420 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
38430 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
38440 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20  n pPg */.  u8 * 
38450 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
38460 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  g->aD