/ Hex Artifact Content
Login

Artifact 1e36580a1f17f02d04e2a8dba70af6194290e9c2:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
3120: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
3130: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
3140: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
3150: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
3160: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
3170: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
3180: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
3190: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
31a0: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
31b0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
31c0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
31d0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
31e0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
31f0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
3200: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
3210: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
3220: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
3230: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
3240: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
3250: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
3260: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
3270: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
3280: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
3290: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
32a0: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
32b0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
32c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32d0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
32e0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
32f0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
3300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3310: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
3320: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
3330: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
3340: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
3350: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
3360: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
3380: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
3390: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
33a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
33b0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
33c0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
33d0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
33e0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
33f0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
3400: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3410: 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a  TS_PENDING flag.
3420: 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72  ** may be incorr
3430: 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a  ectly cleared..*
3440: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
3450: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
3460: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3470: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3480: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3490: 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74  .  BtLock **ppIt
34a0: 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b  er = &pBt->pLock
34b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
34c0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
34d0: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
34e0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
34f0: 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b  || 0==*ppIter );
3500: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
3510: 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68  Trans>0 );..  wh
3520: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
3530: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
3540: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
3550: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62   assert( (pBt->b
3560: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58  tsFlags & BTS_EX
3570: 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70  CLUSIVE)==0 || p
3580: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f  Bt->pWriter==pLo
3590: 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20  ck->pBtree );.  
35a0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
35b0: 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73  >pBtree->inTrans
35c0: 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  >=pLock->eLock )
35d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d  ;.    if( pLock-
35e0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
35f0: 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c      *ppIter = pL
3600: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3610: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3620: 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c  >iTable!=1 || pL
3630: 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b  ock==&p->lock );
3640: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  .      if( pLock
3650: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20  ->iTable!=1 ){. 
3660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
3670: 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  ree(pLock);.    
3680: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
3690: 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70       ppIter = &p
36a0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
36b0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
36c0: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
36d0: 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d   & BTS_PENDING)=
36e0: 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74  =0 || pBt->pWrit
36f0: 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  er );.  if( pBt-
3700: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3710: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3720: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3730: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3740: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3750: 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20  NDING);.  }else 
3760: 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  if( pBt->nTransa
3770: 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  ction==2 ){.    
3780: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3790: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
37a0: 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c  Btree p is concl
37b0: 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a  uding its .    *
37c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37d0: 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c  f there currentl
37e0: 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65  y exists a write
37f0: 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a  r, and p is not.
3800: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74      ** that writ
3810: 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  er, then the num
3820: 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
3830: 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  d by connections
3840: 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68   other.    ** th
3850: 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75  an the writer mu
3860: 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64  st be about to d
3870: 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  rop to zero. In 
3880: 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a  this case.    **
3890: 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e   set the BTS_PEN
38a0: 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a  DING flag to 0..
38b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
38c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75   there is not cu
38d0: 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72  rrently a writer
38e0: 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49  , then BTS_PENDI
38f0: 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  NG must.    ** b
3900: 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20  e zero already. 
3910: 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e  So this next lin
3920: 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e  e is harmless in
3930: 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20   that case..    
3940: 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  */.    pBt->btsF
3950: 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e  lags &= ~BTS_PEN
3960: 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DING;.  }.}../*.
3970: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3980: 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69   changes all wri
3990: 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  te-locks held by
39a0: 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65   Btree p into re
39b0: 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61  ad-locks..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61  tic void downgra
39d0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
39e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
39f0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3a00: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3a10: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3a20: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c  er==p ){.    BtL
3a30: 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20  ock *pLock;.    
3a40: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3a50: 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ;.    pBt->btsFl
3a60: 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43  ags &= ~(BTS_EXC
3a70: 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49  LUSIVE|BTS_PENDI
3a80: 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  NG);.    for(pLo
3a90: 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  ck=pBt->pLock; p
3aa0: 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63  Lock; pLock=pLoc
3ab0: 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  k->pNext){.     
3ac0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3ad0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
3ae0: 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65   || pLock->pBtre
3af0: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c  e==p );.      pL
3b00: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41  ock->eLock = REA
3b10: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
3b20: 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  }.}..#endif /* S
3b30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
3b40: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
3b50: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
3b60: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
3b70: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
3b80: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
3b90: 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75  *.***** This rou
3ba0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73  tine is used ins
3bb0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
3bc0: 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  only ****.**.** 
3bd0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
3be0: 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74 68 65  cursor holds the
3bf0: 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20 42 74   mutex on its Bt
3c00: 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66  Shared.*/.#ifdef
3c10: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
3c20: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48  atic int cursorH
3c30: 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72 73  oldsMutex(BtCurs
3c40: 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  or *p){.  return
3c50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
3c60: 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
3c70: 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  x);.}.static int
3c80: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
3c90: 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29  red(BtCursor *p)
3ca0: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
3cb0: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  orHoldsMutex(p) 
3cc0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
3cd0: 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70  pBtree->db==p->p
3ce0: 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69  Bt->db);.}.#endi
3cf0: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64  f../*.** Invalid
3d00: 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
3d10: 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75   cache of the cu
3d20: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
3d30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3d40: 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  t..** on the sha
3d50: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3d60: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66  ure pBt..*/.#def
3d70: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
3d80: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
3d90: 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ) (pCur->curFlag
3da0: 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
3db0: 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  Ovfl)../*.** Inv
3dc0: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3dd0: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3de0: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3df0: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3e00: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3e10: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3e30: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3e40: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3e50: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3e60: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3e70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3e80: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3e90: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3ea0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3eb0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ed0: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3ee0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3ef0: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3f00: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3f10: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
3f20: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
3f30: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3f40: 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e  a table.** to in
3f50: 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63  validate any inc
3f60: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68  rblob cursors th
3f70: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74  at are open on t
3f80: 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65  he.** row or one
3f90: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69   of the rows bei
3fa0: 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ng modified..**.
3fb0: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
3fc0: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
3fd0: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
3fe0: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
3ff0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
4000: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
4010: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
4020: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
4030: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
4040: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
4050: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
4060: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
4070: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
4080: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
4090: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
40a0: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
40b0: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
40c0: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
40d0: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
40e0: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
40f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
4100: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
4110: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
4120: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
4130: 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72   that specific r
4140: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
4150: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
4160: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
4170: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
4180: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
4190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
41a0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69  check */.  i64 i
41b0: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
41c0: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
41d0: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
41e0: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
41f0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
4200: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
4210: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
4220: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
4230: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
4240: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4250: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4270: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4280: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4290: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
42a0: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
42b0: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
42c0: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
42d0: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
42e0: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
42f0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
4300: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
4310: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
4320: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
4330: 20 20 20 20 20 69 66 28 20 69 73 43 6c 65 61 72       if( isClear
4340: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
4350: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20  .nKey==iRow ){. 
4360: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
4370: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
4380: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
4390: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
43a0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
43b0: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
43c0: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
43d0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
43e0: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
43f0: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4400: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4410: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4420: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4430: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
4440: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4450: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
4460: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
4470: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
4480: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
4490: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
44a0: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
44b0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
44c0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
44d0: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
44e0: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
44f0: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4500: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4510: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4520: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4530: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
4540: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
4550: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
4560: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
4570: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
4580: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
4590: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
45a0: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
45b0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
45c0: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
45d0: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
45e0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
45f0: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4600: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4610: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4620: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4630: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
4640: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
4650: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
4660: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
4670: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
4680: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
4690: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
46a0: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
46b0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
46c0: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
46d0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
46e0: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
46f0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4700: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4720: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4730: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
4740: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
4750: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
4760: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
4770: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
4780: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
4790: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
47a0: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
47b0: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
47c0: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
47d0: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
47e0: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
47f0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4800: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4810: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4820: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4830: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
4840: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
4850: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
4860: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
4870: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
4880: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4890: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
48a0: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
48b0: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
48c0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
48d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
48e0: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
48f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4900: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4910: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4920: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4930: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
4940: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
4950: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
4960: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
4970: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
4980: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
4990: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
49a0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
49b0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
49c0: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
49d0: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
49e0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
49f0: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4a00: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4a10: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4a20: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4a30: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
4a40: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
4a50: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
4a60: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
4a70: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
4a80: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4a90: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4aa0: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4ab0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4ac0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4ad0: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4ae0: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4af0: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4b00: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4b10: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4b20: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4b30: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4b40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
4b50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4b60: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4b70: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
4b80: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
4b90: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4ba0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4bb0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4bc0: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4bd0: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4be0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4bf0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4c00: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
4c10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
4c20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e  SQLITE_OK && pgn
4c30: 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63  o<=sqlite3Bitvec
4c40: 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f  Size(pBt->pHasCo
4c50: 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63  ntent) ){.    rc
4c60: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4c70: 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  Set(pBt->pHasCon
4c80: 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  tent, pgno);.  }
4c90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4ca0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65  ./*.** Query the
4cb0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4cc0: 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a  ntent vector..**
4cd0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
4ce0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
4cf0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4d00: 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65  f page is remove
4d10: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72  d from the.** fr
4d20: 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73  ee-list for reus
4d30: 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61  e. It returns fa
4d40: 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66  lse if it is saf
4d50: 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  e to retrieve th
4d60: 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74  e.** page from t
4d70: 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  he pager layer w
4d80: 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
4d90: 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
4da0: 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  rue otherwise..*
4db0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4dc0: 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
4dd0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4de0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74  gno pgno){.  Bit
4df0: 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48  vec *p = pBt->pH
4e00: 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74  asContent;.  ret
4e10: 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e  urn (p && (pgno>
4e20: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4e30: 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42  e(p) || sqlite3B
4e40: 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e  itvecTest(p, pgn
4e50: 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  o)));.}../*.** C
4e60: 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74  lear (destroy) t
4e70: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4e80: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4e90: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a  This should be.*
4ea0: 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  * invoked at the
4eb0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65   conclusion of e
4ec0: 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ach write-transa
4ed0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4ee0: 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72   void btreeClear
4ef0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4f00: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c  red *pBt){.  sql
4f10: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
4f20: 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  y(pBt->pHasConte
4f30: 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73  nt);.  pBt->pHas
4f40: 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  Content = 0;.}..
4f50: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
4f60: 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b  l of the apPage[
4f70: 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75  ] pages for a cu
4f80: 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsor..*/.static 
4f90: 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73  void btreeReleas
4fa0: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
4fb0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
4fc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4fd0: 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
4fe0: 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  age; i++){.    r
4ff0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
5000: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
5010: 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d   pCur->apPage[i]
5020: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72   = 0;.  }.  pCur
5030: 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a  ->iPage = -1;.}.
5040: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
5050: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
5060: 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75  only argument mu
5070: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  st point to a va
5080: 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65  lid entry.** whe
5090: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
50a0: 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20  is called (i.e. 
50b0: 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52  have eState==CUR
50c0: 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73  SOR_VALID). This
50d0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76  .** function sav
50e0: 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  es the current c
50f0: 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72  ursor key in var
5100: 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65  iables pCur->nKe
5110: 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70  y and.** pCur->p
5120: 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  Key. SQLITE_OK i
5130: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
5140: 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53  ccessful or an S
5150: 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20  QLite error .** 
5160: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
5170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
5180: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5190: 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n intkey table, 
51a0: 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72  then the integer
51b0: 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77   key.** (the row
51c0: 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e  id) is stored in
51d0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20   pCur->nKey and 
51e0: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65  pCur->pKey is le
51f0: 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c  ft set to.** NUL
5200: 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  L. If the cursor
5210: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f   is open on a no
5220: 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20  n-intkey table, 
5230: 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20  then pCur->pKey 
5240: 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f  is .** set to po
5250: 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65  int to a malloce
5260: 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e  d buffer pCur->n
5270: 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  Key bytes in siz
5280: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a  e containing .**
5290: 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61   the key..*/.sta
52a0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
52b0: 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  orKey(BtCursor *
52c0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
52d0: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
52e0: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
52f0: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
5300: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
5310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
5320: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5330: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
5340: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
5350: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
5360: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
5370: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5380: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
5390: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
53a0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
53b0: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
53c0: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
53d0: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
53e0: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
53f0: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
5400: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
5410: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
5420: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
5430: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
5440: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
5450: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
5460: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
5470: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
5480: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5490: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
54a0: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
54b0: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
54c0: 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 69  ** data.  */.  i
54d0: 66 28 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72 49  f( 0==pCur->curI
54e0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69  ntKey ){.    voi
54f0: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
5500: 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e  3Malloc( pCur->n
5510: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5520: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
5530: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
5540: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
5550: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
5560: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5580: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5590: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
55a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
55b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
55c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
55d0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
55e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
55f0: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  T;.    }.  }.  a
5600: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75  ssert( !pCur->cu
5610: 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72  rIntKey || !pCur
5620: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75  ->pKey );.  retu
5630: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5640: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
5650: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
5660: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
5670: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
5680: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
5690: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
56a0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
56b0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
56c0: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
56d0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
56e0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
56f0: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
5700: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
5710: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
5720: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
5730: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
5740: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
5750: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
5760: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5770: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
5780: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5790: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c  ==pCur->eState |
57a0: 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  | CURSOR_SKIPNEX
57b0: 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  T==pCur->eState 
57c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
57d0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
57e0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
57f0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5800: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
5810: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
5820: 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43  IPNEXT ){.    pC
5830: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5840: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
5850: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b  se{.    pCur->sk
5860: 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ipNext = 0;.  }.
5870: 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  .  rc = saveCurs
5880: 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69  orKey(pCur);.  i
5890: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
58a0: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
58b0: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
58c0: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
58d0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
58e0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
58f0: 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75  .  }..  pCur->cu
5900: 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
5910: 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
5920: 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41  ValidOvfl|BTCF_A
5930: 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  tLast);.  return
5940: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
5950: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
5960: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
5970: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43  E_NOINLINE saveC
5980: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43  ursorsOnList(BtC
5990: 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75  ursor*,Pgno,BtCu
59a0: 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  rsor*);../*.** S
59b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
59c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
59d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
59e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
59f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5a00: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
5a10: 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74  Root.  "Saving t
5a20: 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  he cursor positi
5a30: 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a  on" means that.*
5a40: 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69  * the location i
5a50: 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72  n the btree is r
5a60: 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63  emembered in suc
5a70: 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20  h a way that it 
5a80: 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20  can be.** moved 
5a90: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65  back to the same
5aa0: 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20   spot after the 
5ab0: 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d  btree has been m
5ac0: 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a  odified.  This.*
5ad0: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
5ae0: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
5af0: 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69  cursor pExcept i
5b00: 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79  s used to modify
5b10: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66   the.** table, f
5b20: 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74  or example in Bt
5b30: 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42  reeDelete() or B
5b40: 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a  treeInsert()..**
5b50: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
5b60: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
5b70: 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
5b80: 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
5b90: 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72   such .** cursor
5ba0: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68  s should have th
5bb0: 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  eir BTCF_Multipl
5bc0: 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65  e flag set.  The
5bd0: 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a   btreeCursor().*
5be0: 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63  * routine enforc
5bf0: 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54  es that rule.  T
5c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
5c10: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c   needs to be cal
5c20: 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  led in.** the un
5c30: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e  common case when
5c40: 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65   pExpect has the
5c50: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5c60: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
5c70: 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20  f pExpect!=NULL 
5c80: 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  and if no other 
5c90: 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e  cursors are foun
5ca0: 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f  d on the same ro
5cb0: 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e  ot-page,.** then
5cc0: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5cd0: 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65  le flag on pExpe
5ce0: 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74  ct is cleared, t
5cf0: 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a  o avoid another.
5d00: 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c  ** pointless cal
5d10: 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
5d20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  e..**.** Impleme
5d30: 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54  ntation note:  T
5d40: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65  his routine mere
5d50: 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ly checks to see
5d60: 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a   if any cursors.
5d70: 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61  ** need to be sa
5d80: 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f  ved.  It calls o
5d90: 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72  ut to saveCursor
5da0: 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65  sOnList() in the
5db0: 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76   (unusual).** ev
5dc0: 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73  ent that cursors
5dd0: 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20   are in need to 
5de0: 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a  being saved..*/.
5df0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41  static int saveA
5e00: 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  llCursors(BtShar
5e10: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52  ed *pBt, Pgno iR
5e20: 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  oot, BtCursor *p
5e30: 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72  Except){.  BtCur
5e40: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
5e50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5e60: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
5e80: 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63  xcept==0 || pExc
5e90: 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ept->pBt==pBt );
5ea0: 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
5eb0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
5ec0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
5ed0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
5ee0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
5ef0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20  oRoot==iRoot) ) 
5f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
5f10: 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65   p ) return save
5f20: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c  CursorsOnList(p,
5f30: 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29   iRoot, pExcept)
5f40: 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20  ;.  if( pExcept 
5f50: 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c  ) pExcept->curFl
5f60: 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c  ags &= ~BTCF_Mul
5f70: 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  tiple;.  return 
5f80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5f90: 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75   This helper rou
5fa0: 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43  tine to saveAllC
5fb0: 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20  ursors does the 
5fc0: 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73  actual work of s
5fd0: 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72  aving.** the cur
5fe0: 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e  sors if and when
5ff0: 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75   a cursor is fou
6000: 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79  nd that actually
6010: 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67   requires saving
6020: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20  ..** The common 
6030: 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20  case is that no 
6040: 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20  cursors need to 
6050: 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69  be saved, so thi
6060: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
6070: 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20  broken out from 
6080: 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76  its caller to av
6090: 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20  oid unnecessary 
60a0: 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f  stack pointer mo
60b0: 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  vement..*/.stati
60c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
60d0: 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72  NLINE saveCursor
60e0: 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72  sOnList(.  BtCur
60f0: 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20  sor *p,         
6100: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72  /* The first cur
6110: 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73  sor that needs s
6120: 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  aving */.  Pgno 
6130: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
6140: 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72  /* Only save cur
6150: 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52  sor with this iR
6160: 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66  oot. Save all if
6170: 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72   zero */.  BtCur
6180: 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20  sor *pExcept    
6190: 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74  /* Do not save t
61a0: 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  his cursor */.){
61b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70  .  do{.    if( p
61c0: 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d  !=pExcept && (0=
61d0: 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e  =iRoot || p->pgn
61e0: 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b  oRoot==iRoot) ){
61f0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53  .      if( p->eS
6200: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6210: 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d  ID || p->eState=
6220: 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
6230: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6240: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
6250: 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
6260: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
6270: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
6280: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
62a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
62b0: 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e  tcase( p->iPage>
62c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
62d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
62e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
62f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6300: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6310: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6320: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6330: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6340: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6350: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6360: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6370: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6380: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6390: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
63a0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
63b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
63c0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
63d0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
63e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
63f0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6400: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6410: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6420: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6430: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6440: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6450: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6460: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6470: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6480: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6490: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
64a0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
64b0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
64c0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
64d0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
64e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
64f0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6500: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6510: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6520: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6530: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6540: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6550: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6560: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6580: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6590: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
65a0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
65b0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
65c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
65d0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
65e0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
65f0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6600: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6610: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6620: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6650: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6660: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6670: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6680: 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61   key */.  char a
6690: 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20 20  Space[200];     
66a0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61       /* Temp spa
66b0: 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
66c0: 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
66d0: 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46  oc */.  char *pF
66e0: 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ree = 0;..  if( 
66f0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65  pKey ){.    asse
6700: 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28  rt( nKey==(i64)(
6710: 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20  int)nKey );.    
6720: 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  pIdxKey = sqlite
6730: 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b  3VdbeAllocUnpack
6740: 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20  edRecord(.      
6750: 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f    pCur->pKeyInfo
6760: 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66  , aSpace, sizeof
6770: 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65  (aSpace), &pFree
6780: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
6790: 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74  pIdxKey==0 ) ret
67a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
67b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
67c0: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
67d0: 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
67e0: 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b  o, (int)nKey, pK
67f0: 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
6800: 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e    if( pIdxKey->n
6810: 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Field==0 ){.    
6820: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6830: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6840: 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  db, pFree);.    
6850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6870: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
6880: 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
6890: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
68a0: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
68b0: 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
68c0: 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
68d0: 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65  Res);.  if( pFre
68e0: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
68f0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6900: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
6910: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6920: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
6930: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
6940: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
6950: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
6960: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
6970: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
6980: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6990: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
69a0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
69b0: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
69c0: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
69d0: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
69e0: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
69f0: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
6a00: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
6a10: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
6a20: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6a30: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
6a40: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
6a50: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6a60: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
6a70: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
6a80: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
6a90: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
6aa0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69  nt rc;.  int ski
6ab0: 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
6ac0: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
6ad0: 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
6ae0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6af0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6b00: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
6b10: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6b20: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
6b30: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  skipNext;.  }.  
6b50: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6b60: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
6b70: 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74   rc = btreeMovet
6b80: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
6b90: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
6ba0: 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20  0, &skipNext);. 
6bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6bc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
6bd0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
6be0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
6bf0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
6c00: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6c10: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
6c20: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
6c30: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
6c40: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  ;.    pCur->skip
6c50: 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74  Next |= skipNext
6c60: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
6c70: 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72  skipNext && pCur
6c80: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6c90: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
6ca0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6cb0: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
6cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6cd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
6ce0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
6cf0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
6d00: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
6d10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
6d20: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
6d30: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
6d40: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
6d50: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
6d60: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
6d70: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
6d80: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
6d90: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
6da0: 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69  ition where.** i
6db0: 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65  t was last place
6dc0: 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69  d, or has been i
6dd0: 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61  nvalidated for a
6de0: 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e  ny other reason.
6df0: 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20  .** Cursors can 
6e00: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
6e10: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
6e20: 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65  ing at is delete
6e30: 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e  d out.** from un
6e40: 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78  der them, for ex
6e50: 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d  ample.  Cursor m
6e60: 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69  ight also move i
6e70: 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20  f a btree.** is 
6e80: 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  rebalanced..**.*
6e90: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
6ea0: 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55  outine with a NU
6eb0: 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65  LL cursor pointe
6ec0: 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e  r returns false.
6ed0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
6ee0: 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42  eparate sqlite3B
6ef0: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
6f00: 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  e() routine to r
6f10: 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a  estore a cursor.
6f20: 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65  ** back to where
6f30: 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
6f40: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
6f50: 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f  returns true..*/
6f60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
6f70: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
6f80: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
6f90: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
6fa0: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6fb0: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALID;.}../*.** T
6fc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
6fd0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
6fe0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
6ff0: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7000: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7010: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7020: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7030: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7040: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7050: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7060: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7070: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
7080: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
7090: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
70a0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
70b0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
70c0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
70d0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
70e0: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
70f0: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7100: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7110: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7120: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7130: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7140: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7150: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7160: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7170: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7180: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7190: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
71a0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
71b0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
71c0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
71d0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
71e0: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
71f0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7200: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7210: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7220: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7230: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7240: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7260: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7270: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7280: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7290: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
72a0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
72b0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
72c0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
72d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
72e0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
72f0: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7300: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7320: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
7330: 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pNext==0 );.    
7340: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
7350: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
7370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7380: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
7390: 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68  ./*.** Provide h
73a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
73b0: 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75  or.  The particu
73c0: 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28  lar hint given (
73d0: 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20  and the type.** 
73e0: 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  and number of th
73f0: 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65  e varargs parame
7400: 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69  ters) is determi
7410: 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74  ned by the eHint
7420: 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  Type.** paramete
7430: 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69  r.  See the defi
7440: 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42  nitions of the B
7450: 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72  TREE_HINT_* macr
7460: 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  os for details..
7470: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
7480: 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42  treeCursorHint(B
7490: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
74a0: 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e  nt eHintType, ..
74b0: 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e  .){.  /* Used on
74c0: 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61  ly by system tha
74d0: 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65  t substitute the
74e0: 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65  ir own storage e
74f0: 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69  ngine */.}.#endi
7500: 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  f../*.** Provide
7510: 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74   flag hints to t
7520: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  he cursor..*/.vo
7530: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
7540: 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42  ursorHintFlags(B
7550: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
7560: 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73  nsigned x){.  as
7570: 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53  sert( x==BTREE_S
7580: 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52  EEK_EQ || x==BTR
7590: 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78  EE_BULKLOAD || x
75a0: 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68  ==0 );.  pCur->h
75b0: 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69  ints = x;.}...#i
75c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
75d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
75e0: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
75f0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
7600: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
7610: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
7620: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
7630: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
7640: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
7650: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
7660: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
7670: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
7680: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
7690: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
76a0: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
76b0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
76c0: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
76d0: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
76e0: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
76f0: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
7700: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
7710: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
7720: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
7730: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
7740: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7750: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
7760: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
7770: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
7780: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
7790: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
77a0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
77b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
77c0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
77d0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
77e0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
77f0: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
7800: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
7810: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
7820: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
7830: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
7840: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
7850: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
7860: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
7870: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
7880: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
7890: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
78a0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
78b0: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
78c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
78d0: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
78e0: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
78f0: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
7900: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
7910: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
7920: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
7930: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
7940: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
7950: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
7960: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
7970: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
7980: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
7990: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
79a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
79b0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
79c0: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
79d0: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
79e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
79f0: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
7a00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
7a10: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
7a20: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
7a30: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
7a40: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
7a50: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7a60: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
7a70: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
7a80: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
7a90: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
7aa0: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
7ab0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
7ac0: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
7ad0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
7ae0: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
7af0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7b00: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
7b10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
7b20: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
7b30: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
7b40: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
7b50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7b60: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
7b70: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
7b80: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
7b90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
7ba0: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
7bb0: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
7bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
7bd0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
7be0: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
7bf0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
7c00: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
7c10: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
7c20: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
7c30: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
7c40: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7c50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
7c60: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
7c70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
7c80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
7c90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
7ca0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
7cb0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
7cc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7cd0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
7ce0: 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
7cf0: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rn;.  }.  offset
7d00: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
7d10: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
7d20: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
7d30: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7d40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7d50: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
7d60: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
7d70: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
7d80: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
7d90: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
7da0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
7db0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
7dc0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
7dd0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
7de0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
7df0: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
7e00: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
7e10: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
7e20: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
7e30: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
7e40: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
7e50: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
7e60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7e70: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
7e80: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
7e90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7ea0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
7eb0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
7ec0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
7ed0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
7ee0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
7ef0: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
7f00: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
7f10: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
7f20: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
7f30: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
7f40: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
7f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
7f60: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
7f70: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
7f80: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
7f90: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
7fa0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7fb0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
7fc0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
7fd0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
7fe0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
7ff0: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8000: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8010: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8020: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8030: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8040: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8050: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8060: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8070: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8080: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8090: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
80a0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
80b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
80c0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
80d0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
80e0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
80f0: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8100: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8120: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8130: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8140: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8150: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8160: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8170: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8180: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8190: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
81a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
81b0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
81c0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
81d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
81e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
81f0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8200: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8210: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8220: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8230: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8240: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8250: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8260: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8270: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8280: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8290: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
82a0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
82b0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
82c0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
82d0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
82e0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
82f0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8300: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8310: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8320: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8330: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8340: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8350: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8360: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8370: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8390: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
83a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
83b0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
83c0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
83d0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
83e0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
83f0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
8400: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8410: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
8420: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
8430: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8440: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
8450: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
8460: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8470: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
8480: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
8490: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
84a0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
84b0: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
84c0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
84d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
84e0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
84f0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
8500: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
8510: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
8520: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
8530: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
8540: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
8550: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
8560: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
8570: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
8580: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8590: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
85a0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
85b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
85c0: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
85d0: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
85e0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
85f0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
8600: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8610: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8620: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8630: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8640: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
8650: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
8660: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
8670: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
8680: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
8690: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
86a0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
86b0: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
86c0: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
86d0: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
86e0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
86f0: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
8700: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
8710: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
8720: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
8730: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
8740: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
8750: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
8760: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
8770: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
8780: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
8790: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
87a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
87b0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
87c0: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
87d0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
87e0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
87f0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8800: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8820: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8830: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8840: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8850: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8860: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8870: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
8880: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
8890: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
88a0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
88b0: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
88c0: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
88d0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
88e0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
88f0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8900: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8910: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8920: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8930: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8940: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
8950: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
8960: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
8970: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
8980: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
8990: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
89a0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
89b0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
89c0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
89d0: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
89e0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
89f0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
8a00: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
8a10: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
8a20: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
8a30: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
8a40: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8a50: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8a60: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8a70: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
8a80: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
8a90: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
8aa0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
8ab0: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
8ac0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
8ad0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
8ae0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8af0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
8b00: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8b10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
8b20: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
8b30: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
8b40: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
8b50: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
8b60: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
8b70: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8b80: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
8b90: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8ba0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
8bb0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8bc0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8bd0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8be0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8bf0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8c00: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8c10: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8c20: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8c30: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
8c40: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
8c50: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8c60: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8c70: 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d   - pCell) + 4;.}
8c80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8c90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
8ca0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
8cb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
8cc0: 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a  e.xParseCell().*
8cd0: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
8ce0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
8cf0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
8d00: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
8d10: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
8d20: 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  *.** btreeParseC
8d30: 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20  ellPtr()        
8d40: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
8d50: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62   leaf nodes.** b
8d60: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50  treeParseCellNoP
8d70: 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74  ayload()  =>   t
8d80: 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72  able btree inter
8d90: 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72  nal nodes.** btr
8da0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8db0: 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64  dex()   =>   ind
8dc0: 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a  ex btree nodes.*
8dd0: 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c  *.** There is al
8de0: 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e  so a wrapper fun
8df0: 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65  ction btreeParse
8e00: 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b  Cell() that work
8e10: 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d  s for.** all Mem
8e20: 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74  Page types and t
8e30: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  hat references t
8e40: 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78  he cell by index
8e50: 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20   rather than.** 
8e60: 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  by pointer..*/.s
8e70: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
8e80: 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61  ParseCellPtrNoPa
8e90: 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65  yload(.  MemPage
8ea0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8eb0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8ec0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8ed0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8ef0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8f00: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8f10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8f20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8f30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8f40: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  .){.  assert( sq
8f50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8f60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8f70: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8f80: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
8f90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8fa0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8fb0: 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  ==4 );.#ifndef S
8fc0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e  QLITE_DEBUG.  UN
8fd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8fe0: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
8ff0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9000: 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43   + getVarint(&pC
9010: 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70  ell[4], (u64*)&p
9020: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70  Info->nKey);.  p
9030: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
9040: 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f   0;.  pInfo->nLo
9050: 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  cal = 0;.  pInfo
9060: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->pPayload = 0;.
9070: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74    return;.}.stat
9080: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9090: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
90a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
90b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
90c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
90d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9100: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9110: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9120: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9130: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9140: 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49  e */.){.  u8 *pI
9150: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9160: 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e    /* For scannin
9170: 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20  g through pCell 
9180: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
9190: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
91a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
91b0: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
91c0: 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20  */.  u64 iKey;  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91e0: 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61  Extracted Key va
91f0: 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lue */..  assert
9200: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9210: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9220: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9230: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9240: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
9250: 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  af==1 );.  asser
9260: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
9270: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
9280: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
9290: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
92a0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
92b0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
92c0: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
92d0: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
92e0: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
92f0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
9300: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
9310: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9320: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9330: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9340: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9350: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9360: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
9370: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
9380: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
9390: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
93a0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
93b0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
93c0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
93d0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
93e0: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
93f0: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
9400: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9410: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9420: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
9430: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
9440: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
9450: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
9460: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
9470: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
9480: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
9490: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
94a0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
94b0: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
94c0: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
94d0: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
94e0: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
94f0: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
9500: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
9510: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
9520: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
9530: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
9540: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9550: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
9560: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
9570: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
9580: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
9590: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
95a0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
95b0: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
95c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
95d0: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
95e0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
95f0: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
9600: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
9610: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
9620: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
9630: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
9640: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
9650: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9660: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
9670: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
9680: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
9690: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
96a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
96b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
96c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
96d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
96e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
96f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
9700: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
9710: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
9720: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
9730: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
9740: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
9750: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
9760: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
9770: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
9780: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
97b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
97c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
97d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
97e0: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
97f0: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
9800: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9810: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
9820: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9830: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9840: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9850: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
9860: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
9870: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
9880: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
9890: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
98a0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
98b0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
98c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
98d0: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
98f0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
9900: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
9910: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
9920: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9930: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9940: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9950: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9960: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9970: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9980: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
9990: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
99a0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
99b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
99c0: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
99d0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
99e0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
99f0: 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
9a00: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
9a10: 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29  nPayload>=0x80 )
9a20: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
9a30: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
9a40: 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66  nPayload &= 0x7f
9a50: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
9a60: 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79  nPayload = (nPay
9a70: 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  load<<7) | (*++p
9a80: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9a90: 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65    }while( *(pIte
9aa0: 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65  r)>=0x80 && pIte
9ab0: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
9ac0: 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f  pIter++;.  pInfo
9ad0: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
9ae0: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  d;.  pInfo->nPay
9af0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
9b00: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
9b10: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
9b20: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9b30: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9b40: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9b50: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9b60: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9b70: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9b90: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9ba0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9bb0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9bc0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9bd0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9be0: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
9bf0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
9c00: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
9c10: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
9c20: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
9c30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9c40: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9c50: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9c60: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9c70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9c80: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9c90: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9ca0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9cb0: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9cc0: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9cd0: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
9cf0: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
9d00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9d10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9d20: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9d30: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
9d40: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9d50: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
9d60: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
9d70: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
9d80: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9d90: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
9da0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9db0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
9dc0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64  Cell(pPage, find
9dd0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
9de0: 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  l), pInfo);.}../
9df0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
9e00: 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
9e10: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
9e20: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78  of the MemPage.x
9e30: 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68  CellSize.** meth
9e40: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74  od..**.** Comput
9e50: 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  e the total numb
9e60: 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74  er of bytes that
9e70: 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e   a Cell needs in
9e80: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9e90: 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74  a area of the bt
9ea0: 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72  ree-page.  The r
9eb0: 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63  eturn number inc
9ec0: 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a  ludes the cell.*
9ed0: 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e  * data header an
9ee0: 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c  d the local payl
9ef0: 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79  oad, but not any
9f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f   overflow page o
9f10: 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75  r.** the space u
9f20: 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20  sed by the cell 
9f30: 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63  pointer..**.** c
9f40: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
9f50: 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61  oad()    =>   ta
9f60: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  ble internal nod
9f70: 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74  es.** cellSizePt
9f80: 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20  r()             
9f90: 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e  =>   all index n
9fa0: 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61  odes & table lea
9fb0: 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69  f nodes.*/.stati
9fc0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
9fd0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
9fe0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
9ff0: 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c  u8 *pIter = pCel
a000: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a010: 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20  PtrSize; /* For 
a020: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74  looping over byt
a030: 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20  es of pCell */. 
a040: 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20   u8 *pEnd;      
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a070: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a080: 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a  nt */.  u32 nSiz
a090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74   /* Size value t
a0c0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66  o return */..#if
a0d0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a0e0: 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  .  /* The value 
a0f0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
a100: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
a110: 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73   always be the s
a120: 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ame as.  ** the 
a130: 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29  (CellInfo.nSize)
a140: 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20   value found by 
a150: 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72  doing a full par
a160: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63  se of the.  ** c
a170: 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44  ell. If SQLITE_D
a180: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c  EBUG is defined,
a190: 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20   an assert() at 
a1a0: 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20  the bottom of.  
a1b0: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
a1c0: 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74   verifies that t
a1d0: 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73  his invariant is
a1e0: 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a   not violated. *
a1f0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62  /.  CellInfo deb
a200: 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d  uginfo;.  pPage-
a210: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
a220: 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67  e, pCell, &debug
a230: 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  info);.#endif.. 
a240: 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b   nSize = *pIter;
a250: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78  .  if( nSize>=0x
a260: 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  80 ){.    pEnd =
a270: 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20   &pIter[8];.    
a280: 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20  nSize &= 0x7f;. 
a290: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69     do{.      nSi
a2a0: 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20  ze = (nSize<<7) 
a2b0: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
a2c0: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
a2d0: 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20   *(pIter)>=0x80 
a2e0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a2f0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
a300: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
a310: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49  Key ){.    /* pI
a320: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
a330: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
a340: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
a350: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
a360: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
a370: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
a380: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
a390: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
a3a0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
a3b0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
a3c0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
a3d0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
a3e0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
a3f0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a400: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a410: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74  <pEnd );.  }.  t
a420: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
a430: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a440: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
a450: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a460: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
a470: 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d   nSize<=pPage->m
a480: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
a490: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
a4a0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
a4b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20    if( nSize<4 ) 
a4c0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c  nSize = 4;.  }el
a4d0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c  se{.    int minL
a4e0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
a4f0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
a500: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
a510: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
a520: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
a530: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
a540: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a550: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a560: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
a570: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a580: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a590: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
a5a0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
a5b0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
a5c0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
a5d0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
a5e0: 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  4 + (u16)(pIter 
a5f0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20  - pCell);.  }.  
a600: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
a610: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c  ebuginfo.nSize |
a620: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
a630: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53    return (u16)nS
a640: 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  ize;.}.static u1
a650: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  6 cellSizePtrNoP
a660: 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a  ayload(MemPage *
a670: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
a680: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
a690: 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46   pCell + 4; /* F
a6a0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a6b0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a6c0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a6d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a6e0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a6f0: 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
a700: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a710: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a720: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a730: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a740: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a750: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a760: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a770: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a780: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a790: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a7a0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a7b0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a7c0: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a7d0: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a7e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a7f0: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a800: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a810: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a820: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a830: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a840: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a850: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a860: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
a870: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
a880: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
a890: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
a8a0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20  dPtrSize==4 );. 
a8b0: 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20   pEnd = pIter + 
a8c0: 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49  9;.  while( (*pI
a8d0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a8e0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61  Iter<pEnd );.  a
a8f0: 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f  ssert( debuginfo
a900: 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49  .nSize==(u16)(pI
a910: 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20  ter - pCell) || 
a920: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
a930: 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74  return (u16)(pIt
a940: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a  er - pCell);.}..
a950: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
a960: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
a970: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
a980: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
a990: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
a9a0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
a9b0: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
a9c0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
a9d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a9e0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
a9f0: 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  rn pPage->xCellS
aa00: 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ize(pPage, findC
aa10: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
aa20: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
aa30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aa40: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
aa50: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
aa60: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
aa70: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
aa80: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
aa90: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
aaa0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
aab0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
aac0: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
aad0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
aae0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
aaf0: 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  d ptrmapPutOvflP
ab00: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
ab10: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e  e, u8 *pCell, in
ab20: 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49  t *pRC){.  CellI
ab30: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20  nfo info;.  if( 
ab40: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
ab50: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
ab60: 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  0 );.  pPage->xP
ab70: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
ab80: 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
ab90: 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
aba0: 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
abb0: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
abc0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
abd0: 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29  l[info.nSize-4])
abe0: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
abf0: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
ac00: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
ac10: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
ac20: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
ac30: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
ac40: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
ac50: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
ac60: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
ac70: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
ac80: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
ac90: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
aca0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
acb0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
acc0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
acd0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
ace0: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
acf0: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
ad00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ad10: 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45  rea..**.** EVIDE
ad20: 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d  NCE-OF: R-44582-
ad30: 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79  60138 SQLite may
ad40: 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69   from time to ti
ad50: 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a  me reorganize a.
ad60: 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20 73  ** b-tree page s
ad70: 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  o that there are
ad80: 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f   no freeblocks o
ad90: 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73  r fragment bytes
ada0: 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20  , all.** unused 
adb0: 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69  bytes are contai
adc0: 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c  ned in the unall
add0: 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65 67  ocated space reg
ade0: 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20  ion, and all.** 
adf0: 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64  cells are packed
ae00: 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65 20   tightly at the 
ae10: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ae20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
ae30: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65  efragmentPage(Me
ae40: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
ae50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ae70: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
ae80: 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20   int pc;        
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
aea0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d  ddress of the i-
aeb0: 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  th cell */.  int
aec0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
aed0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
aee0: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
aef0: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
af00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
af10: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
af20: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
af30: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
af40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
af50: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
af60: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
af70: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
af80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af90: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
afa0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
afb0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afd0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
afe0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
aff0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
b000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b020: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
b030: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b040: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
b050: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
b060: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
b070: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
b080: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
b090: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
b0a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b0b0: 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20  ar *src;        
b0c0: 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e  /* Source of con
b0d0: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
b0e0: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
b0f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
b100: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
b110: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
b120: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
b130: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b140: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b150: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
b160: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b170: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b180: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b190: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b1b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b1c0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
b1d0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
b1e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1f0: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
b200: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b210: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b220: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b230: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a   );.  temp = 0;.
b240: 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70    src = data = p
b250: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
b260: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
b270: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
b280: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
b290: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
b2a0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
b2b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
b2c0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
b2d0: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
b2e0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
b2f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b300: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  e;.  cbrk = usab
b310: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
b320: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
b330: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
b340: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
b350: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
b360: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
b370: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
b380: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
b390: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
b3a0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
b3b0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
b3c0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
b3d0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
b3e0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b3f0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
b400: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b410: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
b420: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
b430: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
b440: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
b450: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
b460: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
b470: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
b480: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
b490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
b4a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
b4b0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
b4c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4e0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4f0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
b500: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
b510: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70   );.    size = p
b520: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b530: 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29  pPage, &src[pc])
b540: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
b550: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
b560: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
b570: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
b580: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
b590: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b5a0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b5b0: 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69   assert( cbrk+si
b5c0: 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26  ze<=usableSize &
b5d0: 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  & cbrk>=iCellFir
b5e0: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b5f0: 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75  se( cbrk+size==u
b600: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b610: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69   testcase( pc+si
b620: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
b630: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
b640: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20  Addr, cbrk);.   
b650: 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a   if( temp==0 ){.
b660: 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20        int x;.   
b670: 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20     if( cbrk==pc 
b680: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
b690: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
b6a0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
b6b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
b6c0: 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65  r);.      x = ge
b6d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b6e0: 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  +5]);.      memc
b6f0: 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61  py(&temp[x], &da
b700: 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a  ta[x], (cbrk+siz
b710: 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73  e) - x);.      s
b720: 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d  rc = temp;.    }
b730: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
b740: 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63  a[cbrk], &src[pc
b750: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ], size);.  }.  
b760: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
b770: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
b780: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b790: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
b7a0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
b7b0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
b7c0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
b7d0: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
b7e0: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
b7f0: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
b800: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
b810: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b820: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b830: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
b840: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
b850: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
b860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b880: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b890: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b8a0: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
b8b0: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
b8c0: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
b8d0: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
b8e0: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
b8f0: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
b900: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
b910: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b920: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
b930: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
b940: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
b950: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
b960: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
b970: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
b980: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
b990: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
b9a0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
b9b0: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
b9c0: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
b9d0: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
b9e0: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
b9f0: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
ba00: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ba10: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ba20: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ba30: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
ba40: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ba50: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
ba60: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
ba70: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
ba80: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
ba90: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
baa0: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
bab0: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
bac0: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
bad0: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
bae0: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
baf0: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
bb00: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
bb10: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
bb20: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
bb30: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
bb40: 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20  rOffset;.  u8 * 
bb50: 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
bb60: 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  g->aData;.  int 
bb70: 69 41 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b  iAddr = hdr + 1;
bb80: 0a 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32  .  int pc = get2
bb90: 62 79 74 65 28 26 61 44 61 74 61 5b 69 41 64 64  byte(&aData[iAdd
bba0: 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  r]);.  int x;.  
bbb0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  int usableSize =
bbc0: 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
bbd0: 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
bbe0: 28 20 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a  ( pc>0 );.  do{.
bbf0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
bc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bc10: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
bc20: 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44  t */.    /* EVID
bc30: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36  ENCE-OF: R-06866
bc40: 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b  -39125 Freeblock
bc50: 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e  s are always con
bc60: 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20  nected in order 
bc70: 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61  of.    ** increa
bc80: 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a  sing offset. */.
bc90: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
bca0: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41  eSize-4 || pc<iA
bcb0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a  ddr+4 ){.      *
bcc0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
bcd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
bce0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
bcf0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
bd00: 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33  -OF: R-22710-533
bd10: 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64  28 The third and
bd20: 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66   fourth bytes of
bd30: 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65   each.    ** fre
bd40: 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69  eblock form a bi
bd50: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
bd60: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69   which is the si
bd70: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c  ze of the freebl
bd80: 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79  ock.    ** in by
bd90: 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  tes, including t
bda0: 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72  he 4-byte header
bdb0: 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20  . */.    size = 
bdc0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
bdd0: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  pc+2]);.    if( 
bde0: 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74  (x = size - nByt
bdf0: 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74  e)>=0 ){.      t
be00: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
be10: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
be20: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69   x==3 );.      i
be30: 66 28 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c  f( pc < pPg->cel
be40: 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e  lOffset+2*pPg->n
be50: 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20  Cell || size+pc 
be60: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
be70: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
be80: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
be90: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
bea0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
beb0: 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20  e if( x<4 ){.   
bec0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
bed0: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
bee0: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
bef0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
bf00: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
bf10: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
bf20: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
bf30: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
bf40: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
bf50: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
bf60: 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b  ]>57 ) return 0;
bf70: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  ..        /* Rem
bf80: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
bf90: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
bfa0: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
bfb0: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  er of.        **
bfc0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
bfd0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
bfe0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  e. */.        me
bff0: 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64  mcpy(&aData[iAdd
c000: 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20  r], &aData[pc], 
c010: 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74  2);.        aDat
c020: 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29  a[hdr+7] += (u8)
c030: 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  x;.      }else{.
c040: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
c050: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
c060: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
c070: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
c080: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
c090: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
c0a0: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
c0b0: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
c0c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32   */.        put2
c0d0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
c0e0: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ], x);.      }. 
c0f0: 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61       return &aDa
c100: 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20  ta[pc + x];.    
c110: 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63  }.    iAddr = pc
c120: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
c130: 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b  yte(&aData[pc]);
c140: 0a 20 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b  .  }while( pc );
c150: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
c160: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
c170: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
c180: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
c190: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
c1a0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
c1b0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
c1c0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
c1d0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
c1e0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
c1f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
c200: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
c210: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
c220: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
c230: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
c240: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
c250: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
c260: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
c270: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
c280: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
c290: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
c2a0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
c2b0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
c2c0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
c2d0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
c2e0: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
c2f0: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
c300: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
c310: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
c320: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
c330: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
c340: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
c350: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
c360: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
c370: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
c380: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
c390: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
c3a0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
c3b0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
c3c0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
c3d0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
c3e0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
c3f0: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
c400: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
c410: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
c420: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
c430: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
c440: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c450: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
c460: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
c470: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
c480: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
c490: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
c4a0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
c4b0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
c4c0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c4f0: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
c500: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
c510: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c520: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
c530: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
c540: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
c550: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
c560: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
c570: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
c580: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
c590: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
c5a0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
c5b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c5c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c5d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c5e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
c5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
c620: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
c630: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
c640: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
c650: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
c660: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
c670: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
c680: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
c690: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
c6a0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
c6b0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
c6c0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
c6d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
c6e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
c6f0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
c700: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
c710: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
c720: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
c730: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
c740: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
c750: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
c760: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
c770: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
c780: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
c790: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
c7a0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
c7b0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
c7c0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
c7d0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
c7e0: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
c7f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
c800: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
c810: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
c820: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
c830: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
c840: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
c850: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
c860: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
c870: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
c880: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
c890: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
c8a0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
c8b0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
c8c0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61  ata[hdr+5]);.  a
c8d0: 73 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74  ssert( top<=(int
c8e0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
c8f0: 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72  bleSize ); /* Pr
c900: 65 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49  event by getAndI
c910: 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69  nitPage() */.  i
c920: 66 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20  f( gap>top ){.  
c930: 20 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20    if( top==0 && 
c940: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c950: 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b  leSize==65536 ){
c960: 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35  .      top = 655
c970: 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  36;.    }else{. 
c980: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c990: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c9a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
c9b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
c9c0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
c9d0: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
c9e0: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
c9f0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
ca00: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
ca10: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
ca20: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
ca30: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
ca40: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
ca50: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
ca60: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
ca70: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
ca80: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
ca90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
caa0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
cab0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
cac0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
cad0: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
cae0: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
caf0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
cb00: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
cb10: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
cb20: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
cb30: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
cb40: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
cb50: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
cb60: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
cb70: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
cb80: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
cb90: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
cba0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
cbb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
cbc0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
cbd0: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
cbe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
cbf0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
cc00: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
cc10: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
cc20: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
cc30: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
cc40: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
cc50: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
cc60: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
cc70: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
cc80: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
cc90: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
cca0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
ccb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
ccc0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
ccd0: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
cce0: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
ccf0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
cd00: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cd10: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
cd20: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
cd30: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
cd40: 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70  ( gap+nByte<=top
cd50: 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41   );.  }...  /* A
cd60: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
cd70: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
cd80: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
cd90: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
cda0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
cdb0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54  content area.  T
cdc0: 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  he btreeInitPage
cdd0: 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65  () call has alre
cde0: 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74  ady.  ** validat
cdf0: 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ed the freelist.
ce00: 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65    Given that the
ce10: 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c   freelist is val
ce20: 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  id, there.  ** i
ce30: 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68  s no way that th
ce40: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e  e allocation can
ce50: 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20   extend off the 
ce60: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e  end of the page.
ce70: 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74  .  ** The assert
ce80: 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65  () below verifie
ce90: 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  s the previous s
cea0: 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  entence..  */.  
ceb0: 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20  top -= nByte;.  
cec0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ced0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61  dr+5], top);.  a
cee0: 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65  ssert( top+nByte
cef0: 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
cf00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
cf10: 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70  );.  *pIdx = top
cf20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
cf30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
cf40: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
cf50: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
cf60: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
cf70: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
cf80: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
cf90: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
cfa0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74  pPage->aData[iSt
cfb0: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
cfc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
cfd0: 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73  k is iSize bytes
cfe0: 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74  ..**.** Adjacent
cff0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20   freeblocks are 
d000: 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a  coalesced..**.**
d010: 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20   Note that even 
d020: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
d030: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
d040: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
d050: 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61  itPage(),.** tha
d060: 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e  t routine will n
d070: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
d080: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20  p between cells 
d090: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  or freeblocks.  
d0a0: 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64  Nor.** does it d
d0b0: 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66  etect cells or f
d0c0: 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65  reeblocks that e
d0d0: 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65  ncrouch into the
d0e0: 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a   reserved bytes.
d0f0: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
d100: 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64   the page.  So d
d110: 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72  o additional cor
d120: 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  ruption checks i
d130: 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f  nside this.** ro
d140: 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e  utine and return
d150: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
d160: 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20  if any problems 
d170: 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  are found..*/.st
d180: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
d190: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d1a0: 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75  e, u16 iStart, u
d1b0: 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36  16 iSize){.  u16
d1c0: 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20   iPtr;          
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
d1f0: 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65   ptr to next fre
d200: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20  eblock */.  u16 
d210: 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20  iFreeBlk;       
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
d240: 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f  the next freeblo
d250: 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  ck */.  u8 hdr; 
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d280: 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a   Page header siz
d290: 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a  e.  0 or 100 */.
d2a0: 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20    u8 nFrag = 0; 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63          /* Reduc
d2d0: 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74  tion in fragment
d2e0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69  ation */.  u16 i
d2f0: 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65  OrigSize = iSize
d300: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d310: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c   /* Original val
d320: 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20  ue of iSize */. 
d330: 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61   u32 iLast = pPa
d340: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d350: 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73  ize-4; /* Larges
d360: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
d370: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
d380: 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61   u32 iEnd = iSta
d390: 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20  rt + iSize;     
d3a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d3b0: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69 53  byte past the iS
d3c0: 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tart buffer */. 
d3d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
d3e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
d3f0: 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63  ata;   /* Page c
d400: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
d410: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d420: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d430: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
d440: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
d450: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
d460: 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
d470: 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65  || iStart>=pPage
d480: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
d490: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
d4a0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  e );.  assert( C
d4b0: 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e  ORRUPT_DB || iEn
d4c0: 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  d <= pPage->pBt-
d4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
d4e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d500: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d510: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69 7a  ;.  assert( iSiz
d520: 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=4 );   /* Min
d530: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
d540: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
d550: 20 69 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29   iStart<=iLast )
d560: 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  ;..  /* Overwrit
d570: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
d580: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
d590: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
d5a0: 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74  _delete.  ** opt
d5b0: 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  ion is enabled *
d5c0: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  /.  if( pPage->p
d5d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
d5e0: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
d5f0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
d600: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
d610: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20   iSize);.  }..  
d620: 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66  /* The list of f
d630: 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  reeblocks must b
d640: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
d650: 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20  rder.  Find the 
d660: 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68  .  ** spot on th
d670: 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53 74  e list where iSt
d680: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  art should be in
d690: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68  serted..  */.  h
d6a0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
d6b0: 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20  ffset;.  iPtr = 
d6c0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64  hdr + 1;.  if( d
d6d0: 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26  ata[iPtr+1]==0 &
d6e0: 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20  & data[iPtr]==0 
d6f0: 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20  ){.    iFreeBlk 
d700: 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75  = 0;  /* Shortcu
d710: 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77  t for the case w
d720: 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74  hen the freelist
d730: 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d   is empty */.  }
d740: 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
d750: 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74   (iFreeBlk = get
d760: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
d770: 5d 29 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c  ]))>0 && iFreeBl
d780: 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  k<iStart ){.    
d790: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69    if( iFreeBlk<i
d7a0: 50 74 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53  Ptr+4 ) return S
d7b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d7c0: 50 54 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d  PT;.      iPtr =
d7d0: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
d7e0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
d7f0: 6b 3e 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e  k>iLast ) return
d800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d810: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
d820: 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20  ( iFreeBlk>iPtr 
d830: 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  || iFreeBlk==0 )
d840: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74  ;.  .    /* At t
d850: 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a  his point:.    *
d860: 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20  *    iFreeBlk:  
d870: 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   First freeblock
d880: 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f   after iStart, o
d890: 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20  r zero if none. 
d8a0: 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20     **    iPtr:  
d8b0: 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73 73       The address
d8c0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   of a pointer to
d8d0: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
d8e0: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
d8f0: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
d900: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
d910: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
d920: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
d930: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
d940: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
d950: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
d960: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
d970: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
d980: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
d990: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
d9a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d9b0: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
d9c0: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
d9d0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
d9e0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
d9f0: 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42  iEnd > pPage->pB
da00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20  t->usableSize ) 
da10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
da20: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
da30: 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d    iSize = iEnd -
da40: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69   iStart;.      i
da50: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
da60: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c  te(&data[iFreeBl
da70: 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  k]);.    }.  .  
da80: 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20    /* If iPtr is 
da90: 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63  another freebloc
daa0: 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66 20 69  k (that is, if i
dab0: 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66  Ptr is not the f
dac0: 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70  reelist.    ** p
dad0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
dae0: 67 65 20 68 65 61 64 65 72 29 20 74 68 65 6e 20  ge header) then 
daf0: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
db00: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
db10: 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65  .    ** coalesce
db20: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
db30: 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20  f iPtr..    */. 
db40: 20 20 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b     if( iPtr>hdr+
db50: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
db60: 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20  PtrEnd = iPtr + 
db70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
db80: 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Ptr+2]);.      i
db90: 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53  f( iPtrEnd+3>=iS
dba0: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tart ){.        
dbb0: 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61  if( iPtrEnd>iSta
dbc0: 72 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rt ) return SQLI
dbd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dbe0: 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b  .        nFrag +
dbf0: 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72 45  = iStart - iPtrE
dc00: 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a  nd;.        iSiz
dc10: 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b  e = iEnd - iPtr;
dc20: 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
dc30: 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a  = iPtr;.      }.
dc40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
dc50: 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20  rag>data[hdr+7] 
dc60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
dc70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
dc80: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
dc90: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66   nFrag;.  }.  if
dca0: 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79  ( iStart==get2by
dcb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
dcc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
dcd0: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  ew freeblock is 
dce0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
dcf0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
dd00: 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a  tent area,.    *
dd10: 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64  * so just extend
dd20: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dd30: 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74 68  t area rather th
dd40: 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65  an create anothe
dd50: 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73  r.    ** freelis
dd60: 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69  t entry */.    i
dd70: 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  f( iPtr!=hdr+1 )
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dd90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dda0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ddb0: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
ddc0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
ddd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
dde0: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
ddf0: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
de00: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
de10: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
de20: 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
de30: 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
de40: 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79  art);.    put2by
de50: 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  te(&data[iStart]
de60: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
de70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
de80: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
de90: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
dea0: 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69  nFree += iOrigSi
deb0: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
dec0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ded0: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
dee0: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
def0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
df00: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
df10: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
df20: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
df30: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
df40: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
df50: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
df60: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
df70: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
df80: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
df90: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
dfa0: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
dfb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
dfc0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
dfd0: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
dfe0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
dff0: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
e000: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
e010: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
e020: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
e030: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
e040: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
e050: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
e060: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
e070: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
e080: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
e090: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
e0a0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
e0b0: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
e0c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
e0d0: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
e0e0: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
e0f0: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
e100: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e110: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
e120: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
e130: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
e140: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
e150: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
e160: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
e170: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
e180: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
e190: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
e1a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50  Page->leaf;.  pP
e1b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e1c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20   cellSizePtr;.  
e1d0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
e1e0: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
e1f0: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
e200: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
e210: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e220: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
e230: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
e240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
e250: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
e260: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
e2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
e2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
e2c0: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
e2d0: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
e2e0: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
e2f0: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
e300: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
e310: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
e320: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
e330: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
e340: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e350: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66  tKey = 1;.    if
e360: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
e370: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
e380: 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20  tKeyLeaf = 1;.  
e390: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
e3a0: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
e3b0: 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d  seCellPtr;.    }
e3c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
e3d0: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e3e0: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  0;.      pPage->
e3f0: 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
e400: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
e410: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
e420: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
e430: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
e440: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20  ayload;.    }.  
e450: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
e460: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
e470: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e480: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e490: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
e4a0: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
e4b0: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
e4c0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e4d0: 52 2d 32 37 32 32 35 2d 35 33 39 33 36 20 41 20  R-27225-53936 A 
e4e0: 76 61 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73  value of 2 means
e4f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20   the page is an 
e500: 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20  interior.    ** 
e510: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67  index b-tree pag
e520: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
e530: 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29  ( (PTF_ZERODATA)
e540: 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==2 );.    /* EV
e550: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35  IDENCE-OF: R-165
e560: 37 31 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65  71-11615 A value
e570: 20 6f 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65   of 10 means the
e580: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
e590: 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74      ** index b-t
e5a0: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
e5b0: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
e5c0: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
e5d0: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
e5e0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
e5f0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e600: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
e610: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e620: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e630: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e640: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e650: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e660: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e670: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e680: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e690: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e6a0: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e6b0: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e6c0: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e6d0: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e6e0: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e6f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e700: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e710: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e720: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e730: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e740: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e750: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e760: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e770: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e780: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e790: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e7a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e7b0: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e7c0: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e7d0: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e7e0: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e7f0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e800: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e810: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e820: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e830: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e840: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e850: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e860: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e870: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e880: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e890: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e8a0: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e8b0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e8c0: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e8d0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e8e0: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e8f0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e900: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e910: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e920: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e930: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e940: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e950: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e960: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e970: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e980: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e990: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9a0: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e9b0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e9c0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e9d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e9e0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e9f0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
ea00: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
ea10: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
ea20: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
ea30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
ea40: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
ea50: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
ea60: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
ea70: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
ea80: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
ea90: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
eaa0: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
eab0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
eac0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
ead0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
eae0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
eaf0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
eb00: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
eb10: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
eb20: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
eb30: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
eb40: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
eb50: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
eb60: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
eb70: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
eb80: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
eb90: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
eba0: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
ebb0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
ebc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ebd0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ebe0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
ebf0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ec00: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
ec10: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec20: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
ec30: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ec40: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
ec50: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
ec60: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
ec70: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
ec80: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
ec90: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
eca0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
ecb0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
ecc0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
ecd0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
ece0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
ecf0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
ed00: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
ed10: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
ed20: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ed30: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ed40: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ed50: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ed60: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
ed70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
ed80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
ed90: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
eda0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
edb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
edc0: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
edd0: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ede0: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
edf0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ee00: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
ee10: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
ee20: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ee30: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ee40: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ee50: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ee60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
ee70: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
ee80: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
ee90: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
eea0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
eeb0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
eec0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
eed0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
eee0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
eef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ef00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ef10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ef20: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
ef30: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
ef40: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ef50: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
ef60: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
ef70: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ef80: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ef90: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
efa0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
efb0: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
efc0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
efd0: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
efe0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
eff0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
f000: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f010: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
f020: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
f030: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f040: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
f050: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
f060: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
f070: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
f080: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
f090: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
f0a0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
f0b0: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
f0c0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
f0d0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
f0e0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
f0f0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
f100: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
f110: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f120: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f130: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
f140: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
f150: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
f160: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f170: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f180: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f190: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f1a0: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f1b0: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f1c0: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f1d0: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f1e0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f1f0: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f200: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f210: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f220: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f230: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f240: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f250: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f260: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f270: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f280: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f290: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f2a0: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f2b0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f2c0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f2d0: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f2e0: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f2f0: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f300: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f310: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f320: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f330: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f340: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f350: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f360: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f370: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f380: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f390: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f3a0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f3b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f3c0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f3d0: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f3e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f3f0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f400: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f410: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f420: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f430: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f440: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f450: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f460: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f470: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f480: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f490: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f4a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f4b0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f4c0: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f4d0: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f4e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f4f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f500: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f510: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f520: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f530: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f540: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f550: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f560: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f570: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f580: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f590: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f5a0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f5b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f5c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5e0: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f5f0: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f600: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f610: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f620: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f630: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f640: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f660: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f670: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f680: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f690: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f6a0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f6b0: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f6c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f6d0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f6e0: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f6f0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f700: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f710: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f720: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f730: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f740: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f750: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f760: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f770: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f780: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f790: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f7a0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f7b0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f7c0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f7d0: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f7e0: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f7f0: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f800: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f810: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f820: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f830: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f840: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f850: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f860: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f870: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f880: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f890: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f8a0: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f8b0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f8c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f8d0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f8e0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f8f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f900: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f910: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f920: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f930: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f950: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f970: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f980: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f990: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f9a0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f9b0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f9c0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
f9d0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
f9e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f9f0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
fa00: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
fa10: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
fa20: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
fa30: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
fa40: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
fa50: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
fa60: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
fa70: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
fa80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fa90: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
faa0: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
fab0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
fac0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
fad0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
fae0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
faf0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
fb00: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
fb10: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
fb20: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
fb30: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
fb40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
fb50: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
fb60: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
fb70: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
fb80: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
fb90: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
fba0: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
fbb0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
fbc0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fbd0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
fbe0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
fbf0: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
fc00: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
fc10: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
fc20: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
fc30: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
fc40: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
fc50: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
fc60: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
fc70: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
fc80: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
fc90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
fca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fcb0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
fcc0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
fcd0: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
fce0: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
fcf0: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fd00: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fd10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fd20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fd30: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fd40: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fd50: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fd60: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fd70: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fd80: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fd90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fda0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fdb0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fdc0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fdd0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fde0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fdf0: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fe00: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fe10: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
fe20: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fe30: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fe40: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fe50: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fe60: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fe70: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
fe80: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fe90: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fea0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
feb0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fec0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
fed0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
fee0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
fef0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ff00: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
ff10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ff20: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
ff30: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
ff40: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ff50: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ff60: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
ff70: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
ff80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
ff90: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
ffa0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
ffb0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
ffc0: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
ffd0: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
ffe0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
fff0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
10000 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
10010 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
10020 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
10030 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
10040 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10050 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
10060 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
10070 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
10080 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
10090 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
100a0 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
100b0 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
100c0 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
100d0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
100e0 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
100f0 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
10100 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
10110 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
10120 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
10130 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
10140 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
10150 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
10160 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
10170 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
10180 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
10190 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
101a0 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
101b0 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
101c0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
101d0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
101e0 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
101f0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
10200 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
10210 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
10220 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
10230 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
10240 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10250 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
10260 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
10270 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10280 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10290 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
102a0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
102b0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
102c0 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
102d0 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
102e0 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
102f0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
10300 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
10310 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
10320 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
10330 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
10340 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
10350 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
10360 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
10370 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
10380 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
10390 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
103a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
103b0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
103c0 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
103d0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
103e0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
103f0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
10400 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
10410 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
10420 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
10430 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
10440 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
10450 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
10460 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
10470 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
10480 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
10490 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
104a0 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
104b0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
104c0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
104d0 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
104e0 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
104f0 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
10500 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
10510 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
10520 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
10530 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
10540 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
10550 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
10560 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
10570 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
10580 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
10590 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
105a0 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
105b0 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
105c0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
105d0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
105e0 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
105f0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
10600 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
10610 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
10620 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10630 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10640 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
10650 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
10660 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
10670 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
10680 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
10690 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
106a0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
106b0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
106c0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
106d0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
106e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
106f0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
10700 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
10710 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
10720 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
10730 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
10740 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
10750 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10760 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10770 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
10780 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10790 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
107a0 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
107b0 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
107c0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
107d0 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
107e0 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
107f0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
10800 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
10810 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10820 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
10830 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
10840 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
10850 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
10860 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
10870 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
10880 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
10890 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
108a0 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
108b0 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
108c0 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
108d0 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
108e0 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
108f0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
10900 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
10910 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
10920 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
10930 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10940 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10950 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
10960 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
10970 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
10980 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
10990 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
109a0 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
109b0 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
109c0 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
109d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
109e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
109f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
10a00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
10a10 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
10a20 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
10a30 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
10a40 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
10a50 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
10a60 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
10a70 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
10a80 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
10a90 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
10aa0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
10ab0 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
10ac0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
10ad0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
10ae0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
10af0 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
10b00 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  0x8000000)==0 );
10b10 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
10b20 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
10b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
10b40 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10b50 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
10b60 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ize it..**.** If
10b70 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68   pCur!=0 then th
10b80 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
10b90 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20  fetched as part 
10ba0 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  of a moveToChild
10bb0 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20  ().** call.  Do 
10bc0 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
10bd0 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
10be0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
10bf0 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74  ase..** And if t
10c00 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20  he fetch fails, 
10c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
10c20 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72  t decrement pCur
10c30 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ->iPage..**.** T
10c40 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68  he page is fetch
10c50 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65  ed as read-write
10c60 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20   unless pCur is 
10c70 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a  not NULL and is.
10c80 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  ** a read-only c
10c90 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
10ca0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10cb0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
10cc0 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
10cd0 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
10ce0 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
10cf0 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
10d00 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
10d10 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
10d20 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
10d30 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d50 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
10d60 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
10d70 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
10d80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10d90 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
10da0 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
10db0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
10dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
10dd0 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
10de0 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74  ter here */.  Bt
10df0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e10 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69   Cursor to recei
10e20 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  ve the page, or 
10e30 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52  NULL */.  int bR
10e40 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadOnly         
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10e60 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
10e70 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  y page */.){.  i
10e80 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10e90 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10eb0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10ec0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10ed0 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67  pCur==0 || ppPag
10ee0 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61 67 65  e==&pCur->apPage
10ef0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
10f00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
10f10 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d  =0 || bReadOnly=
10f20 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46  =pCur->curPagerF
10f30 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74  lags );.  assert
10f40 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75  ( pCur==0 || pCu
10f50 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20  r->iPage>0 );.. 
10f60 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
10f70 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
10f80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10f90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10fa0 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10fb0 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10fc0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10fd0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
10fe0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
10ff0 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
11000 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66  bReadOnly);.  if
11010 28 20 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ( rc ){.    goto
11020 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11030 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70  error;.  }.  *pp
11040 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
11050 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
11060 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
11070 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
11080 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20  >isInit==0 ){.  
11090 20 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44    btreePageFromD
110a0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
110b0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72  gno, pBt);.    r
110c0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
110d0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
110e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
11100 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11110 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41  .      goto getA
11120 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11130 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
11140 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
11150 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
11160 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
11170 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74  e)->aData==sqlit
11180 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
11190 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
111a0 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   If obtaining a 
111b0 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61  child page for a
111c0 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74   cursor, we must
111d0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
111e0 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f   page is.  ** co
111f0 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
11200 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a  e root page. */.
11210 20 20 69 66 28 20 70 43 75 72 20 26 26 20 28 28    if( pCur && ((
11220 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c  *ppPage)->nCell<
11230 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e  1 || (*ppPage)->
11240 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75  intKey!=pCur->cu
11250 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20  rIntKey) ){.    
11260 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11270 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
11280 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11290 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
112a0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
112b0 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
112c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
112d0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
112e0 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
112f0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
11300 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
11310 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11320 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
11330 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
11340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11350 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
11360 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
11370 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
11380 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
11390 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
113a0 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
113b0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
113c0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
113d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
113e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
113f0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
11400 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
11410 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11420 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
11430 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11440 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11450 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11460 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11480 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11490 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
114a0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
114b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
114c0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
114d0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
114e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
114f0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
11500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
11510 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
11520 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
11530 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
11540 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
11550 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
11560 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
11570 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
11580 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
11590 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
115a0 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
115b0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
115c0 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
115d0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
115e0 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
115f0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
11600 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
11610 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
11620 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
11630 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
11640 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
11650 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
11660 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
11670 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
11680 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
11690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
116a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
116b0 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
116c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
116d0 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
116e0 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
116f0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
11700 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
11710 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
11720 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
11730 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
11740 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
11750 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
11760 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11770 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
11780 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
11790 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
117a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
117b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117c0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
117d0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
117e0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
117f0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
11800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11810 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
11820 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
11830 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11840 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11850 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
11860 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
11870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
11880 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
11890 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118a0 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
118b0 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
118c0 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
118d0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
118e0 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
118f0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
11900 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11910 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
11920 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
11930 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
11940 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
11950 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
11960 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11970 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
11980 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
11990 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
119a0 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
119b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
119c0 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
119d0 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
119e0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
119f0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
11a00 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
11a10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
11a20 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
11a30 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
11a40 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
11a50 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
11a60 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11a70 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
11a80 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
11a90 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    a
11aa0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11ab0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
11ac0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11ad0 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11ae0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
11af0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11b00 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
11b10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
11b20 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
11b30 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
11b40 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11b50 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11b60 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11b70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11b80 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11b90 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11ba0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
11bb0 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
11bc0 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
11bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11be0 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
11bf0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
11c00 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
11c10 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
11c20 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
11c30 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
11c40 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11c50 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11c60 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11c70 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11c80 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11c90 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11ca0 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
11cb0 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
11cc0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
11cd0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11ce0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11cf0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
11d00 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11d10 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11d20 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11d30 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11d40 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11d50 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11d60 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11d70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11d90 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11da0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
11db0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11dc0 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
11dd0 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
11de0 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
11df0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
11e00 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11e10 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11e20 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11e30 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11e40 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11e50 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11e60 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11e70 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11e80 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11e90 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11ea0 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11eb0 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11ec0 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11ed0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11ee0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11ef0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11f00 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11f10 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11f20 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11f30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11f40 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11f50 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11f60 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11f70 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11f80 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11f90 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11fa0 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11fb0 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11fc0 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11fd0 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11fe0 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11ff0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
12000 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
12010 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
12020 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
12030 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
12040 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
12050 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
12060 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12070 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
12080 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
12090 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
120a0 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
120b0 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
120c0 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
120d0 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
120e0 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
120f0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
12100 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
12110 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12120 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
12130 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
12140 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
12150 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
12160 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
12170 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
12180 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
12190 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
121a0 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
121b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
121c0 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
121d0 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
121e0 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
121f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
12200 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12210 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
12220 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
12230 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
12240 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
12250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
12260 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
12270 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
12280 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
12290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
122a0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
122b0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
122c0 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
122d0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
122e0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
122f0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
12300 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
12310 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
12320 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
12330 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
12340 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12360 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
12370 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
12380 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
12390 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
123a0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
123b0 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
123c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
123d0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
123e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
123f0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
12400 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
12410 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
12420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
12430 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
12440 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
12450 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
12460 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
12470 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
12480 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
12490 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
124a0 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
124b0 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
124c0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
124d0 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
124e0 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
124f0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
12500 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
12510 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
12520 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
12530 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
12540 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
12550 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
12560 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
12570 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12580 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
12590 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
125a0 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
125b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
125c0 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
125d0 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
125e0 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
125f0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12610 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
12620 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
12630 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12650 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
12660 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
12670 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
12680 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
12690 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
126a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
126b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126c0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
126d0 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
126e0 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
126f0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
12700 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
12710 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
12720 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
12730 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
12740 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
12750 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
12760 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
12770 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
12780 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
12790 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
127a0 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
127b0 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
127c0 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
127d0 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
127e0 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
127f0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
12800 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
12810 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
12820 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
12830 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
12840 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
12850 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12860 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
12870 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
12880 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
12890 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
128a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
128b0 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
128c0 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
128d0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
128e0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
128f0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
12900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12910 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
12920 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
12930 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
12940 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
12950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12960 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12970 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12980 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12990 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
129a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
129b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
129c0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
129d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
129e0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
129f0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12a00 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
12a10 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
12a20 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
12a30 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
12a40 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
12a50 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
12a60 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12a70 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12a80 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12a90 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12aa0 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12ab0 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12ac0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12ad0 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12ae0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12af0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12b00 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
12b10 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
12b20 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
12b30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12b40 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
12b50 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
12b60 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12b70 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12b80 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12b90 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12ba0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12bb0 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12bc0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12bd0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12be0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12bf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12c00 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
12c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12c20 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
12c30 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
12c40 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
12c50 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
12c60 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
12c70 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
12c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12c90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12ca0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
12cb0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
12cf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12d00 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
12d10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12d20 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
12d30 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
12d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
12d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12d60 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12d70 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
12d80 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
12d90 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
12da0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
12db0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
12dc0 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
12dd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12de0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
12df0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
12e00 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
12e10 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
12e20 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
12e30 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
12e40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12e50 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
12e60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
12e70 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
12e80 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
12e90 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
12ea0 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
12eb0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
12ec0 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
12ed0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
12ee0 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
12ef0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
12f00 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
12f10 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
12f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f30 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
12f40 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
12f50 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
12f60 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
12f70 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
12f80 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
12f90 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
12fa0 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
12fb0 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
12fc0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
12fd0 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
12fe0 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
12ff0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
13000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13010 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13020 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13030 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13040 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13050 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
13060 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13070 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
13080 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
13090 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
130a0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
130b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
130c0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
130d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
130e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
130f0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
13100 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
13110 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
13120 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13140 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
13150 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
13160 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13170 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
13180 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
13190 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
131a0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
131b0 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
131c0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
131d0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
131e0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
131f0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
13200 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
13210 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
13220 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
13230 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
13240 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
13250 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
13260 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13270 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
13280 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
13290 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
132a0 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
132b0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
132c0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
132d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
132e0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
132f0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
13300 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
13310 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
13320 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
13330 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
13340 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
13350 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
13360 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
13370 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
13380 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
13390 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
133a0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
133b0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
133c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
133d0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
133e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
133f0 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
13400 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13410 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
13420 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13430 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
13440 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
13450 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
13460 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
13470 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
13480 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
13490 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
134a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
134b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
134c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
134d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
134e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
134f0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
13500 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
13510 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
13530 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
13540 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
13550 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
13560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13570 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
13580 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
13590 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
135a0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
135b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
135c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
135d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
135e0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
135f0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
13600 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13610 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13620 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
13630 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
13640 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
13650 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
13660 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
13670 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13680 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
13690 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
136a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
136b0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
136c0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
136d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
136e0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
136f0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
13700 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
13710 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
13720 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
13730 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13740 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
13750 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
13760 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
13770 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
13780 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
13790 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
137a0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
137b0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
137c0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
137d0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
137e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
137f0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
13800 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
13810 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
13820 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
13830 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
13840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13850 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
13860 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
13870 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
13880 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
13890 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
138a0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
138b0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
138c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
138d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
138e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
138f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
13900 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
13910 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
13920 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13930 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13940 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
13950 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
13960 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
13970 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13980 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
13990 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
139a0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
139b0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
139c0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
139d0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
139e0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
139f0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
13a00 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
13a10 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13a20 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13a30 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
13a40 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
13a50 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
13a60 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
13a70 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
13a80 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
13a90 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
13aa0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
13ab0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13ac0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
13ad0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13ae0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13af0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
13b00 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
13b10 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
13b20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
13b30 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
13b40 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
13b50 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
13b60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
13b70 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
13b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13b90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13ba0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
13bb0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
13bc0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
13bd0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
13be0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
13bf0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
13c00 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
13c10 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
13c20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
13c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
13c40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
13c50 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
13c60 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
13c70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13c80 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13c90 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
13ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13cb0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
13cc0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
13cd0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
13ce0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
13cf0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
13d00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13d10 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
13d20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
13d30 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
13d40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13d50 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13d60 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
13d70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
13d80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
13d90 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13da0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
13db0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
13dc0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
13dd0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
13de0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
13df0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
13e00 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
13e10 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
13e20 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
13e30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
13e40 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
13e50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13e60 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
13e70 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
13e80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
13e90 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
13ea0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
13eb0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
13ec0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
13ed0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
13ee0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
13ef0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
13f00 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
13f10 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
13f20 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
13f30 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
13f40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13f50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13f60 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
13f70 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
13f80 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
13f90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
13fa0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
13fb0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
13fc0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
13fd0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
13fe0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
13ff0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
14000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
14010 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14020 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
14030 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
14040 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
14050 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14060 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14070 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
14080 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
14090 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
140a0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
140b0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
140c0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
140d0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
140e0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
140f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14100 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14110 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14120 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14130 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14140 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14150 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14160 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14170 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14180 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14190 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
141a0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
141b0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
141c0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
141d0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
141e0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
141f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14200 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14210 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14220 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14230 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14240 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14250 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14260 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14270 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14280 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14290 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
142a0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
142b0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
142c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
142d0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
142e0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
142f0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14300 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
14310 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14320 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14330 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
14340 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14350 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
14360 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
14370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14380 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
14390 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
143a0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
143b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
143c0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
143d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
143e0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
143f0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14400 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14410 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
14420 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
14430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14440 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
14450 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
14460 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
14470 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
14480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
14490 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
144a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
144b0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
144c0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
144d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
144e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
144f0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14500 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14510 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
14520 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
14530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14540 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14550 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
14560 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
14570 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
14580 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
14590 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
145a0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
145b0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
145c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
145d0 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
145e0 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
145f0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
14600 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
14610 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
14620 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
14630 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
14640 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14650 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
14660 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
14670 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14680 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
14690 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
146a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
146b0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
146c0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
146d0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
146e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
146f0 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
14700 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
14710 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14720 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
14730 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14740 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
14750 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
14760 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
14770 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
14780 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
14790 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
147a0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
147b0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
147c0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
147d0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
147e0 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
147f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
14800 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
14810 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
14820 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
14830 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14840 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14860 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14870 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
14880 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
14890 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
148a0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
148b0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
148c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
148d0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
148e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
148f0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
14900 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
14910 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14920 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14930 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
14940 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14950 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
14960 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
14970 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
14980 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
14990 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
149a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
149b0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
149c0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
149d0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
149e0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
149f0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
14a00 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
14a10 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14a20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14a30 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
14a40 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
14a50 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
14a60 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
14a70 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
14a80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
14a90 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
14aa0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
14ab0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
14ac0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14ad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14ae0 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14af0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
14b00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
14b10 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
14b20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
14b30 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14b40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14b50 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
14b60 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
14b70 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
14b80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
14b90 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
14ba0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
14bb0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
14bc0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
14bd0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
14be0 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
14bf0 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
14c00 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
14c10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
14c20 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
14c30 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14c40 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
14c50 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
14c60 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
14c70 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
14c80 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
14c90 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
14ca0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
14cb0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
14cc0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
14cd0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
14ce0 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
14cf0 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
14d00 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
14d10 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
14d20 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
14d30 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
14d40 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
14d50 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
14d60 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
14d70 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
14d80 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
14d90 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
14da0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14db0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14dc0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14dd0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14de0 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14df0 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14e00 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14e10 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14e20 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14e30 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14e40 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
14e50 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
14e60 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
14e70 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
14e80 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
14e90 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
14ea0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14eb0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14ec0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14ed0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14ee0 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14ef0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14f00 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14f10 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14f20 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14f30 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14f40 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
14f50 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
14f60 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
14f70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
14f80 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
14f90 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
14fa0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14fb0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14fc0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14fd0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14fe0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14ff0 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
15000 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
15010 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
15020 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
15030 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
15040 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15050 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
15060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
15070 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
15080 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
15090 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
150a0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
150b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
150c0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
150d0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
150e0 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
150f0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15100 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15110 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15120 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15130 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15140 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15150 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
15160 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
15170 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15180 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15190 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
151a0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
151b0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
151c0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
151d0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
151e0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
151f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15200 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15210 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15220 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15230 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15240 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15250 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
15260 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
15270 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
15280 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15290 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
152a0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
152b0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
152c0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
152d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
152e0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
152f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15300 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15310 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15320 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15330 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15340 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15350 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
15360 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
15370 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
15380 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
15390 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
153a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
153b0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
153c0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
153d0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
153e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
153f0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15400 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
15410 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
15420 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
15430 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15440 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
15450 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
15460 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15470 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
15480 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
15490 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
154a0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
154b0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
154c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
154d0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
154e0 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
154f0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
15500 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
15510 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
15520 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
15530 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
15540 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
15550 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
15560 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
15570 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
15580 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
15590 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
155a0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
155b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
155c0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
155d0 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
155e0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
155f0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
15600 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
15610 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15620 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
15630 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
15640 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
15650 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
15660 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15670 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15680 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
15690 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
156a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
156b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
156c0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
156d0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
156e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
156f0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
15700 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15710 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
15720 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
15730 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15740 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15750 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
15760 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
15770 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15780 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
15790 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
157a0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
157b0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
157c0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
157d0 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
157e0 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
157f0 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
15800 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
15810 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
15820 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
15830 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
15840 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
15850 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
15860 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
15870 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
15880 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
15890 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
158a0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
158b0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
158c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
158d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
158e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
158f0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15900 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15910 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15920 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15930 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
15940 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15950 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15960 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15980 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
15990 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
159a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
159b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
159c0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
159d0 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
159e0 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
159f0 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
15a00 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
15a10 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
15a20 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
15a30 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
15a40 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
15a50 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
15a60 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
15a70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
15a80 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
15a90 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
15aa0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
15ab0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
15ac0 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
15ad0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
15ae0 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
15af0 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
15b00 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
15b10 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
15b20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15b30 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
15b40 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
15b50 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
15b60 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
15b70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15b80 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
15b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ba0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15bb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15bc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15bd0 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
15be0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
15bf0 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
15c00 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15c10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15c20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
15c30 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
15c40 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15c50 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15c60 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15c70 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15c80 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15c90 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15ca0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15cb0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15cc0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15cd0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15ce0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15cf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15d00 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15d10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15d20 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15d30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15d40 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15d50 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15d60 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15d70 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15d80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15d90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15da0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15db0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15dc0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15dd0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15de0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15df0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15e00 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15e10 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15e20 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15e30 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15e40 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15e50 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15e60 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15e70 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15e80 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15e90 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15ea0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15eb0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15ec0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15ed0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15ee0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15ef0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15f00 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15f10 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15f20 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15f30 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15f40 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15f50 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15f60 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15f70 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15f80 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15f90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15fa0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15fb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15fc0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15fd0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15ff0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
16000 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
16010 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
16020 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
16030 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
16040 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
16050 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16060 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
16070 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16080 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16090 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
160a0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
160b0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
160c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
160d0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
160e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
160f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16100 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16110 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
16120 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
16130 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
16140 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16150 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
16160 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
16170 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
16180 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
16190 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
161a0 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
161b0 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
161c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
161d0 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
161e0 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
161f0 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
16200 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
16210 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
16220 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
16230 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
16240 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
16250 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
16260 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
16270 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
16280 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
16290 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
162a0 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
162b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
162c0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
162d0 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
162e0 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
162f0 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
16300 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
16310 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
16320 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
16330 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
16340 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
16350 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
16360 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
16370 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
16380 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
16390 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
163a0 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
163b0 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
163c0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
163d0 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
163e0 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
163f0 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
16400 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
16410 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
16420 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
16430 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
16440 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
16450 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
16460 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16470 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
16480 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
16490 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
164a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
164b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
164c0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
164d0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
164e0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
164f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16500 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
16510 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
16520 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
16530 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16540 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
16550 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
16560 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
16570 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
16580 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
16590 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
165a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
165b0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
165c0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
165d0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
165e0 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
165f0 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
16600 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
16610 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
16620 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16630 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
16640 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
16650 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
16660 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
16670 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
16680 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
16690 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
166a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
166b0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
166c0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
166d0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
166e0 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
166f0 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
16700 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
16710 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16720 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
16730 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
16740 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16750 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
16760 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
16770 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
16780 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
16790 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
167a0 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
167b0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
167c0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
167d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
167e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
167f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
16800 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
16810 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
16820 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
16830 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16840 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
16850 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
16860 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
16870 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16880 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
16890 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
168a0 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
168b0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
168c0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
168d0 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
168e0 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
168f0 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
16900 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
16910 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
16920 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
16930 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
16940 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
16950 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
16960 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
16970 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
16980 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
16990 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
169a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
169b0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
169c0 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
169d0 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
169e0 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
169f0 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
16a00 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
16a10 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
16a20 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
16a30 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
16a40 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
16a50 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
16a60 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
16a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16a80 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
16a90 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
16aa0 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
16ab0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16ac0 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
16ad0 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
16ae0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
16af0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
16b00 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
16b10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16b20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
16b30 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
16b40 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
16b50 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
16b60 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
16b70 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
16b80 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
16b90 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
16ba0 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
16bb0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
16bc0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
16bd0 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
16be0 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
16bf0 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
16c00 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
16c10 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
16c20 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
16c30 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
16c40 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
16c50 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
16c60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16c70 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
16c80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16c90 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16ca0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16cb0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
16cc0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16cd0 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
16ce0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
16cf0 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
16d00 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
16d10 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
16d20 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
16d30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16d40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16d50 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
16d60 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
16d70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
16d80 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
16d90 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
16da0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
16db0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
16dc0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
16dd0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
16de0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
16df0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
16e00 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16e10 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
16e20 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
16e30 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
16e40 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16e50 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16e60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16e70 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
16e80 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
16e90 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
16ea0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
16eb0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16ec0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
16ed0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
16ee0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
16ef0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
16f00 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
16f10 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
16f20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
16f30 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
16f40 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
16f50 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
16f60 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
16f70 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
16f80 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
16f90 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
16fa0 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
16fb0 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
16fc0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
16fd0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
16fe0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16ff0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
17000 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
17010 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17020 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
17030 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
17040 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
17050 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
17060 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
17070 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
17080 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
17090 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
170a0 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
170b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
170c0 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
170d0 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
170e0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
170f0 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
17100 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
17110 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
17120 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17130 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
17140 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
17150 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
17160 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
17170 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
17180 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
17190 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
171a0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
171b0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
171c0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
171d0 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
171e0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
171f0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17200 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
17210 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
17220 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17230 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
17240 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
17250 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
17260 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
17270 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
17280 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
17290 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
172a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
172b0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
172c0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
172d0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
172e0 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
172f0 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
17300 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
17310 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
17320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
17330 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
17340 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
17350 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
17360 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
17370 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17380 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17390 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
173a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
173b0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
173c0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
173d0 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
173e0 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
173f0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
17400 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
17410 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17420 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17430 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
17440 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17450 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
17460 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17470 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
17480 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
17490 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
174a0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
174b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
174c0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
174d0 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
174e0 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
174f0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
17500 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
17510 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
17520 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
17530 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
17550 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
17560 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
17570 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
17580 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
17590 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
175a0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
175b0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
175c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
175d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
175e0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
175f0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
17600 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
17610 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
17620 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
17630 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
17640 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
17650 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
17660 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
17670 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
17680 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
17690 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
176a0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
176b0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
176c0 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
176d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
176e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
176f0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
17700 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
17710 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
17720 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
17730 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17740 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
17750 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
17760 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17770 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17780 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17790 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
177a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
177b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
177c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
177d0 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
177e0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
177f0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
17800 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
17810 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
17820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17830 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
17850 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
17860 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
17870 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
17880 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
17890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
178a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
178b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
178c0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
178d0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
178e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
178f0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
17900 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
17910 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
17920 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
17930 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
17940 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
17950 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
17960 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
17970 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
17980 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17990 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
179a0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
179b0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
179c0 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
179d0 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
179e0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
179f0 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
17a00 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
17a10 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
17a20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
17a30 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
17a40 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
17a50 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
17a60 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
17a70 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
17a80 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
17a90 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
17aa0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17ab0 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45   R-43737-39999 E
17ac0 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74  very valid SQLit
17ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17ae0 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69  begins.    ** wi
17af0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
17b00 20 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65   16 bytes (in he
17b10 78 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20  x): 53 51 4c 69 
17b20 37 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37  74 65 20 66 6f 7
17b30 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37  2 6d.    ** 61 7
17b40 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20  4 20 33 00. */. 
17b50 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
17b60 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
17b70 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
17b80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17b90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17ba0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17bb0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
17bc0 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
17bd0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
17be0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
17bf0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
17c00 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
17c10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17c20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17c30 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
17c40 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
17c50 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
17c60 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
17c70 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
17c80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17c90 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
17ca0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17cb0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
17cc0 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
17cd0 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
17ce0 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
17cf0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
17d00 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
17d10 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
17d20 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
17d30 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
17d40 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
17d50 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
17d60 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
17d70 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
17d80 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
17d90 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
17da0 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
17db0 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
17dc0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
17dd0 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
17de0 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
17df0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
17e00 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
17e10 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
17e20 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
17e30 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
17e40 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
17e50 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
17e60 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
17e70 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
17e80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
17e90 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
17ea0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
17eb0 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
17ec0 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
17ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
17ee0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
17ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
17f00 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
17f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17f20 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
17f30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
17f50 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17f60 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
17f70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
17f80 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 20 20  L_SYNCHRONOUS.  
17f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
17fa0 62 3b 0a 20 20 20 20 20 20 20 20 44 62 20 2a 70  b;.        Db *p
17fb0 44 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Db;.        if( 
17fc0 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20  (db=pBt->db)!=0 
17fd0 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29  && (pDb=db->aDb)
17fe0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
17ff0 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18000 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18010 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18020 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  ++; }.          
18030 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
18040 74 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  t==0.           
18050 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18060 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f 44 45 46  evel==SQLITE_DEF
18070 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18080 2b 31 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  +1.          ){.
18090 20 20 20 20 20 20 20 20 20 20 20 20 70 44 62 2d              pDb-
180a0 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
180b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
180c0 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31  AL_SYNCHRONOUS+1
180d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
180e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
180f0 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
18100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18110 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18120 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18130 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18140 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
18150 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
18160 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
18170 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
18180 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18190 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
181a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
181b0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
181c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
181d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
181e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
181f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18200 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33  F: R-15465-20813
18210 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64   The maximum and
18220 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65   minimum embedde
18230 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a  d payload.    **
18240 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74   fractions and t
18250 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20  he leaf payload 
18260 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20  fraction values 
18270 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20  must be 64, 32, 
18280 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20  and 32..    **. 
18290 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
182a0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
182b0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
182c0 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
182d0 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
182e0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
182f0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
18300 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
18310 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
18320 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
18330 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
18340 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18350 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18360 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18370 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d  NCE-OF: R-51873-
18380 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73  39618 The page s
18390 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61  ize for a databa
183a0 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a  se file is.    *
183b0 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
183c0 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67  the 2-byte integ
183d0 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e  er located at an
183e0 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79   offset of 16 by
183f0 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  tes from.    ** 
18400 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
18410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18420 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53  le. */.    pageS
18430 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
18440 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
18450 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45  ]<<16);.    /* E
18460 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
18470 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69  008-21688 The si
18480 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20  ze of a page is 
18490 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20  a power of two. 
184a0 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31     ** between 51
184b0 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c  2 and 65536 incl
184c0 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66  usive. */.    if
184d0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
184e0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
184f0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
18500 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
18510 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
18520 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
18530 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18540 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18550 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18560 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
18570 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==0 );.    /* EV
18580 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33  IDENCE-OF: R-593
18590 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65  10-51205 The "re
185a0 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69  served space" si
185b0 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65  ze in the 1-byte
185c0 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20  .    ** integer 
185d0 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20  at offset 20 is 
185e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
185f0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
18600 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a  the end of.    *
18610 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72  * each page to r
18620 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e  eserve for exten
18630 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20  sions. .    **. 
18640 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
18650 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
18660 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
18670 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
18680 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
18690 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
186a0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
186b0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
186c0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
186d0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
186e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
186f0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61  ader. */.    usa
18700 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
18710 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
18720 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
18730 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
18740 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
18750 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
18760 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
18770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
18780 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
18790 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
187a0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
187b0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
187c0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
187d0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
187e0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
187f0 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
18800 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
18810 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
18820 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
18830 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
18840 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
18850 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
18860 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
18870 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
18880 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
18890 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
188a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
188b0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
188c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
188d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
188e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
188f0 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
18900 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
18910 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
18920 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
18930 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
18940 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
18950 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18970 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
18980 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
18990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
189a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42     }.    if( (pB
189b0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
189c0 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f  QLITE_RecoveryMo
189d0 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e  de)==0 && nPage>
189e0 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20  nPageFile ){.   
189f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18a00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
18a10 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18a20 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18a30 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18a40 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37  -OF: R-28312-647
18a50 30 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  04 However, the 
18a60 75 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e  usable size is n
18a70 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20  ot allowed to.  
18a80 20 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61    ** be less tha
18a90 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20  n 480. In other 
18aa0 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61  words, if the pa
18ab0 67 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20  ge size is 512, 
18ac0 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18ad0 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73  reserved space s
18ae0 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65  ize cannot excee
18af0 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28  d 32. */.    if(
18b00 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
18b10 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18b20 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
18b30 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
18b40 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
18b50 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
18b60 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
18b70 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
18b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18b90 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
18ba0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
18bb0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
18bc0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
18bd0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
18be0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
18bf0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
18c00 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
18c10 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
18c20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
18c30 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
18c40 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
18c50 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
18c60 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
18c70 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
18c80 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
18c90 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
18ca0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
18cb0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
18cc0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
18cd0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
18ce0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
18cf0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
18d00 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
18d10 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
18d20 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
18d30 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
18d40 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
18d50 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
18d60 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
18d70 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
18d80 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
18d90 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
18da0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
18db0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
18dc0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
18dd0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
18de0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
18df0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
18e00 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
18e10 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
18e20 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
18e30 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
18e40 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
18e50 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
18e60 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
18e70 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
18e80 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
18e90 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
18ea0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
18eb0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
18ec0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
18ed0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
18ee0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
18ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
18f00 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
18f10 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
18f20 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18f30 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
18f40 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
18f50 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
18f60 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
18f70 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
18f80 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
18f90 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
18fa0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
18fb0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
18fc0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
18fd0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
18fe0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
18ff0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
19000 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
19010 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
19020 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
19030 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
19040 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
19050 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
19060 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
19070 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19080 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
19090 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
190a0 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
190b0 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
190c0 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
190d0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
190e0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
190f0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
19100 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
19110 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
19120 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
19130 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
19140 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
19150 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
19160 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
19170 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
19180 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
19190 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
191a0 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
191b0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
191c0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
191d0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
191e0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
191f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
19200 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
19210 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
19220 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
19230 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
19240 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
19250 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
19260 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
19270 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
19280 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
19290 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
192a0 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
192b0 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
192c0 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
192d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
192e0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
192f0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
19300 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
19310 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
19320 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
19330 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
19340 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
19350 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19360 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
19370 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
19380 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
19390 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
193a0 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
193b0 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
193c0 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
193d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
193e0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
193f0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
19400 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19420 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
19430 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
19440 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
19450 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
19460 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
19470 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
19480 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
19490 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
194a0 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
194b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
194c0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
194d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
194e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
194f0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
19500 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
19510 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
19520 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
19530 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
19540 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
19550 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
19560 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
19570 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
19580 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
19590 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
195a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
195b0 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
195c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
195d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
195e0 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
195f0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
19600 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
19610 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
19620 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  age1);.  }.}../*
19630 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
19640 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
19650 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
19660 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
19670 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
19680 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
19690 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
196a0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
196b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
196c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
196d0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
196e0 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
196f0 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
19700 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
19710 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
19720 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19730 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19740 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
19750 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
19760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19770 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
19780 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
19790 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
197a0 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
197b0 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
197c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
197d0 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
197e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
197f0 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
19800 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
19810 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19820 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
19830 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
19840 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
19850 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
19860 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
19870 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
19880 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
19890 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
198a0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
198b0 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
198c0 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
198d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
198e0 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
198f0 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
19900 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
19910 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
19920 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
19930 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
19940 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
19950 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
19960 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
19970 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
19980 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
19990 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
199a0 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
199b0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
199c0 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
199d0 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
199e0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
199f0 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
19a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19a10 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
19a20 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
19a30 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
19a40 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
19a50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
19a60 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
19a70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
19a80 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
19a90 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
19aa0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19ab0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
19ac0 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
19ad0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
19ae0 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
19af0 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
19b00 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
19b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19b20 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
19b30 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
19b40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19b50 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
19b60 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
19b70 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
19b80 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
19b90 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
19ba0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
19bb0 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
19bc0 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
19bd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
19be0 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
19bf0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
19c00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19c10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19c20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19c30 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
19c40 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
19c50 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
19c60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19c70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
19c80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
19c90 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
19ca0 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
19cb0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19cc0 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
19cd0 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
19ce0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
19cf0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
19d00 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
19d10 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
19d20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
19d30 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
19d40 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
19d50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
19d60 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
19d70 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
19d80 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
19d90 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
19da0 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
19db0 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
19dc0 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
19dd0 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
19de0 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
19df0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
19e00 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
19e10 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
19e20 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
19e30 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
19e40 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
19e50 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
19e60 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
19e70 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
19e80 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
19e90 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
19ea0 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
19eb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
19ec0 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
19ed0 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
19ee0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
19ef0 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
19f00 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19f10 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
19f20 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19f30 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
19f40 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
19f50 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
19f60 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19f70 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
19f80 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19f90 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
19fa0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19fb0 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
19fc0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19fd0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
19fe0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
19ff0 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
1a000 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
1a010 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
1a020 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
1a030 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
1a040 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
1a050 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
1a060 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
1a070 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
1a080 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
1a090 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
1a0a0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
1a0b0 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
1a0c0 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
1a0d0 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
1a0e0 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
1a0f0 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
1a100 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
1a110 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
1a120 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1a130 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
1a140 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
1a150 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
1a160 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
1a170 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
1a180 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
1a190 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
1a1a0 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
1a1b0 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
1a1c0 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
1a1d0 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
1a1e0 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
1a1f0 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
1a200 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
1a210 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
1a220 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1a230 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
1a240 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
1a250 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
1a260 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
1a270 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
1a280 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
1a290 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1a2a0 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
1a2b0 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
1a2c0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
1a2d0 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
1a2e0 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
1a2f0 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
1a300 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
1a310 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
1a320 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1a330 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
1a340 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
1a350 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a360 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
1a370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a380 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1a390 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
1a3a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1a3b0 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
1a3c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
1a3d0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1a3e0 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
1a3f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1a400 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1a410 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
1a420 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
1a430 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
1a440 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1a450 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a460 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
1a470 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
1a480 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
1a490 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
1a4a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a4b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1a4c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a4d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1a4e0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
1a4f0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
1a500 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
1a510 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1a520 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
1a530 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
1a540 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
1a550 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a560 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1a570 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
1a580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1a590 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
1a5a0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1a5b0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a5c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1a5d0 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ACHE.  {.    sql
1a5e0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
1a5f0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74  ;.    /* If anot
1a600 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1a610 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1a620 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1a630 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
1a640 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
1a650 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
1a660 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
1a670 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1a680 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65   is.    ** reque
1a690 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
1a6a0 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20  ITE_LOCKED..    
1a6b0 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c  */.    if( (wrfl
1a6c0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
1a6d0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a6e0 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28  WRITE).     || (
1a6f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a700 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
1a710 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c      ){.      pBl
1a720 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
1a730 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73  er->db;.    }els
1a740 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1a750 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a  {.      BtLock *
1a760 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  pIter;.      for
1a770 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
1a780 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
1a790 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
1a7a0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
1a7b0 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
1a7c0 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20           pBlock 
1a7d0 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
1a7e0 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62  >db;.          b
1a7f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1a800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a810 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
1a820 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1a830 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
1a840 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
1a850 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a860 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1a870 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  CHE;.      goto 
1a880 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20  trans_begun;.   
1a890 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1a8a0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
1a8b0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
1a8c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
1a8d0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
1a8e0 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
1a8f0 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
1a900 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
1a910 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
1a920 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
1a930 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
1a940 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1a950 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
1a960 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
1a970 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
1a980 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
1a990 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
1a9a0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
1a9b0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
1a9c0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
1a9d0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1a9e0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a9f0 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
1aa00 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
1aa10 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
1aa20 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1aa30 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
1aa40 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
1aa50 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
1aa60 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
1aa70 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
1aa80 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
1aa90 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
1aaa0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
1aab0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
1aac0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
1aad0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1aae0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
1aaf0 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
1ab00 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
1ab10 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
1ab20 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
1ab30 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1ab40 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
1ab50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
1ab60 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
1ab70 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
1ab80 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
1ab90 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
1aba0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
1abb0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
1abc0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
1abd0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
1abe0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
1abf0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
1ac00 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
1ac10 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
1ac20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1ac30 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
1ac40 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1ac50 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1ac60 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ac70 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1ac80 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
1ac90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1aca0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
1acb0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
1acc0 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
1acd0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
1ace0 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
1acf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ad00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ad10 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
1ad20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ad30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1ad40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ad50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1ad60 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1ad70 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1ad80 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1ad90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1ada0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1adb0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1adc0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1add0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1ade0 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
1adf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ae00 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
1ae10 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1ae20 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
1ae30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
1ae40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ae50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1ae60 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
1ae70 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
1ae80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1ae90 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
1aea0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
1aeb0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
1aec0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
1aed0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
1aee0 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
1aef0 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
1af00 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1af10 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
1af20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
1af30 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1af40 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
1af50 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
1af60 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
1af70 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
1af80 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1af90 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1afa0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
1afb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
1afc0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
1afd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1afe0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
1aff0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b000 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1b010 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
1b020 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
1b030 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
1b040 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
1b050 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1b060 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
1b070 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
1b080 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1b090 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
1b0a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
1b0b0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
1b0c0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
1b0d0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
1b0e0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
1b0f0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
1b100 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
1b110 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
1b120 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
1b130 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
1b140 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
1b150 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
1b160 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
1b170 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
1b180 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
1b190 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
1b1a0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
1b1b0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
1b1c0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
1b1d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
1b1e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
1b1f0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
1b200 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
1b210 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
1b220 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
1b230 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1b240 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
1b250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1b260 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1b270 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1b280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1b2a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1b2b0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1b2c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
1b2d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b2e0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
1b2f0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1b300 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1b310 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1b320 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
1b330 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
1b340 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
1b350 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
1b360 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1b370 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1b380 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1b390 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1b3a0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1b3b0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1b3c0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1b3d0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1b3e0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
1b3f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b400 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1b410 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1b420 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b430 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
1b440 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
1b450 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b460 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b470 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1b480 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b490 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
1b4a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
1b4b0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
1b4c0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
1b4d0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
1b4e0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
1b4f0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
1b500 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1b510 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
1b520 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
1b530 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
1b540 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
1b550 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
1b560 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
1b570 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
1b580 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
1b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
1b5b0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
1b5c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b5f0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
1b600 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
1b610 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b630 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1b640 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1b650 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
1b660 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
1b670 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
1b680 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
1b690 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
1b6a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b6b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1b6c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1b6d0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1b6e0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
1b6f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b700 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
1b710 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
1b720 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
1b730 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1b740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1b750 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1b760 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1b770 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1b780 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1b790 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1b7a0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1b7b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1b7c0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1b7d0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1b7e0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1b7f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1b800 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1b810 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1b820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1b830 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1b840 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1b850 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1b860 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1b870 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1b880 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1b890 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1b8a0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1b8b0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1b8c0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
1b8d0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
1b8e0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
1b8f0 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
1b900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1b910 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1b920 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1b930 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1b940 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1b950 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1b960 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1b970 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1b980 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1b990 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1b9a0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1b9b0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1b9c0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1b9d0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1b9e0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1b9f0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1ba00 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ba20 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1ba30 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1ba40 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1ba50 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1ba60 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1ba70 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1ba80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1ba90 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1baa0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1bab0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1bac0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1bad0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1bae0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1baf0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1bb00 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1bb10 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1bb20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1bb30 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1bb40 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1bb50 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1bb60 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1bb70 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1bb80 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1bb90 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1bba0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1bbb0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1bbc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1bbd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1bbe0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1bbf0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1bc00 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1bc10 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1bc20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1bc30 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1bc40 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1bc50 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1bc60 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1bc70 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1bc80 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1bc90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1bca0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1bcb0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
1bcc0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1bcd0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1bce0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
1bcf0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1bd00 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
1bd10 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
1bd20 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  l;.    int rc;..
1bd30 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
1bd40 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1bd50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1bd60 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1bd70 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1bd80 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1bd90 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1bda0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1bdb0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1bdc0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1bdd0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1bde0 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1bdf0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1be00 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1be10 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1be20 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1be30 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1be40 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1be50 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26  yload.         &
1be60 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  & pCell+info.nSi
1be70 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ze-1<=pPage->aDa
1be80 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1be90 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1bea0 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70  From==get4byte(p
1beb0 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell+info.nSize-
1bec0 34 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  4).        ){.  
1bed0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1bee0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1bef0 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1bf00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bf10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1bf20 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1bf30 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1bf40 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1bf50 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1bf60 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1bf70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bf80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bf90 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1bfa0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1bfb0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1bfc0 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1bfd0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1bfe0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1bff0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1c000 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1c010 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c020 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1c040 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1c050 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1c060 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1c070 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
1c080 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1c090 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
1c0a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c0b0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1c0c0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
1c0d0 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
1c0e0 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
1c0f0 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
1c100 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
1c110 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
1c120 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  ains valid..**.*
1c130 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  * The isCommit f
1c140 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68  lag indicates th
1c150 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  at there is no n
1c160 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
1c170 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  that.** the jour
1c180 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
1c190 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1c1a0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c1b0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20  bPage->pgno .** 
1c1c0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
1c1d0 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
1c1e0 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
1c1f0 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
1c200 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e  to that.** page.
1c210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1c220 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42  elocatePage(.  B
1c230 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
1c240 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1c250 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
1c260 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f  DbPage,        /
1c270 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d  * Open page to m
1c280 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  ove */.  u8 eTyp
1c290 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1c2a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1c2b0 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f   'type' entry fo
1c2c0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1c2d0 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20  gno iPtrPage,   
1c2e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c2f0 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27  er map 'page-no'
1c300 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1c310 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72  ge */.  Pgno iFr
1c320 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  eePage,         
1c330 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e   /* The location
1c340 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65   to move pDbPage
1c350 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43   to */.  int isC
1c360 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1c370 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c    /* isCommit fl
1c380 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ag passed to sql
1c390 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1c3a0 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  e */.){.  MemPag
1c3b0 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f  e *pPtrPage;   /
1c3c0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
1c3d0 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
1c3e0 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f  er to pDbPage */
1c3f0 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20  .  Pgno iDbPage 
1c400 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b  = pDbPage->pgno;
1c410 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1c420 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
1c430 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1c440 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d  ert( eType==PTRM
1c450 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20  AP_OVERFLOW2 || 
1c460 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c470 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20  ERFLOW1 || .    
1c480 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f    eType==PTRMAP_
1c490 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1c4a0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1c4b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1c4c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1c4d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1c4e0 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65   assert( pDbPage
1c4f0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20  ->pBt==pBt );.. 
1c500 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44   /* Move page iD
1c510 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63  bPage from its c
1c520 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
1c530 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  to page number i
1c540 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52  FreePage */.  TR
1c550 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d  ACE(("AUTOVACUUM
1c560 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66  : Moving %d to f
1c570 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72  ree page %d (ptr
1c580 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64   page %d type %d
1c590 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62  )\n", .      iDb
1c5a0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1c5b0 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65   iPtrPage, eType
1c5c0 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
1c5d0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
1c5e0 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d  pPager, pDbPage-
1c5f0 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50  >pDbPage, iFreeP
1c600 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a  age, isCommit);.
1c610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c620 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1c630 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50  n rc;.  }.  pDbP
1c640 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65  age->pgno = iFre
1c650 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  ePage;..  /* If 
1c660 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74  pDbPage was a bt
1c670 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69  ree-page, then i
1c680 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64  t may have child
1c690 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65   pages and/or ce
1c6a0 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f  lls.  ** that po
1c6b0 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1c6c0 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74  pages. The point
1c6d0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
1c6e0 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a  or all these.  *
1c6f0 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  * pages need to 
1c700 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a  be changed..  **
1c710 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65  .  ** If pDbPage
1c720 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   is an overflow 
1c730 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66  page, then the f
1c740 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79  irst 4 bytes may
1c750 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f   store a.  ** po
1c760 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65  inter to a subse
1c770 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
1c780 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  age. If this is 
1c790 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20  the case, then. 
1c7a0 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20   ** the pointer 
1c7b0 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20  map needs to be 
1c7c0 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20  updated for the 
1c7d0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
1c7e0 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  low page..  */. 
1c7f0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1c800 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c810 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c820 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  GE ){.    rc = s
1c830 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
1c840 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1c850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c860 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c870 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  c;.    }.  }else
1c880 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f  {.    Pgno nextO
1c890 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70  vfl = get4byte(p
1c8a0 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  DbPage->aData);.
1c8b0 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c      if( nextOvfl
1c8c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  !=0 ){.      ptr
1c8d0 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74  mapPut(pBt, next
1c8e0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
1c8f0 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67  RFLOW2, iFreePag
1c900 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  e, &rc);.      i
1c910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c920 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1c930 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1c940 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1c950 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
1c960 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20  pointer on page 
1c970 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f  iPtrPage that po
1c980 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65  inted at iDbPage
1c990 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74   so.  ** that it
1c9a0 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65   points at iFree
1c9b0 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74  Page. Also fix t
1c9c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1c9d0 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50  ntry for.  ** iP
1c9e0 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  trPage..  */.  i
1c9f0 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1ca00 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1ca10 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1ca20 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65  ge(pBt, iPtrPage
1ca30 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b  , &pPtrPage, 0);
1ca40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ca50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ca60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ca70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ca80 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72  3PagerWrite(pPtr
1ca90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1caa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cac0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1cad0 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
1cae0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1caf0 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65   rc = modifyPage
1cb00 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65  Pointer(pPtrPage
1cb10 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65  , iDbPage, iFree
1cb20 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20  Page, eType);.  
1cb30 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1cb40 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1cb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cb60 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
1cb70 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65  t(pBt, iFreePage
1cb80 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1cb90 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  e, &rc);.    }. 
1cba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cbb0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
1cbc0 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72  claration requir
1cbd0 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d  ed by incrVacuum
1cbe0 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69  Step(). */.stati
1cbf0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
1cc00 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64  reePage(BtShared
1cc10 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20   *, MemPage **, 
1cc20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38  Pgno *, Pgno, u8
1cc30 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  );../*.** Perfor
1cc40 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
1cc50 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
1cc60 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
1cc70 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
1cc80 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
1cc90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
1cca0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
1ccb0 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
1ccc0 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
1ccd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
1cce0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
1ccf0 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
1cd00 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
1cd10 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
1cd20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
1cd30 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
1cd40 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73  ecifically, this
1cd50 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
1cd60 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
1cd70 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1cd80 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
1cd90 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
1cda0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
1cdb0 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
1cdc0 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
1cdd0 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
1cde0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1cdf0 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
1ce00 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
1ce10 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
1ce20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
1ce30 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
1ce40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1ce50 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1ce60 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
1ce70 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
1ce80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
1ce90 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
1cea0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
1ceb0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
1cec0 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
1ced0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1cee0 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
1cef0 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
1cf00 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
1cf10 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1cf20 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a  uum-on-commit .*
1cf30 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20  * operation, or 
1cf40 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63  false for an inc
1cf50 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1cf60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
1cf70 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
1cf80 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1cf90 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
1cfa0 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  stPg, int bCommi
1cfb0 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  t){.  Pgno nFree
1cfc0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1cfd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1cfe0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
1cff0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
1d000 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1d010 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1d020 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1d030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
1d040 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
1d050 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
1d060 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1d070 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
1d080 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1d090 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
1d0a0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
1d0b0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
1d0c0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
1d0d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1d0e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1d0f0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
1d100 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1d110 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
1d120 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
1d130 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
1d140 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
1d150 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
1d160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d170 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d180 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
1d190 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d1a0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1d1b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d1c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d1d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
1d1e0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
1d1f0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
1d200 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1d210 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
1d220 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
1d230 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
1d240 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
1d250 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
1d260 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20    ** if bCommit 
1d270 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
1d280 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
1d290 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
1d2a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
1d2b0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
1d2c0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1d2d0 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
1d2e0 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
1d2f0 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
1d300 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
1d310 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
1d320 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
1d330 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d340 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1d350 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1d360 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1d370 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d380 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1d390 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
1d3a0 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  g, BTALLOC_EXACT
1d3b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d3c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d3d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d3e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d3f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1d400 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
1d410 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
1d420 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1d430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
1d440 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
1d450 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
1d460 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1d470 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
1d480 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
1d490 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
1d4a0 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20  *pLastPg;.      
1d4b0 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c  u8 eMode = BTALL
1d4c0 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64  OC_ANY;   /* Mod
1d4d0 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  e parameter for 
1d4e0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d4f0 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e  e() */.      Pgn
1d500 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20  o iNear = 0;    
1d510 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79         /* nearby
1d520 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d530 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d540 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20  () */..      rc 
1d550 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1d560 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
1d570 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
1d580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d590 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1d5a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1d5b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43  ..      /* If bC
1d5c0 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74  ommit is zero, t
1d5d0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78  his loop runs ex
1d5e0 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70  actly once and p
1d5f0 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20  age pLastPg.    
1d600 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20    ** is swapped 
1d610 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66  with the first f
1d620 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20  ree page pulled 
1d630 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73  off the free lis
1d640 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
1d650 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
1d660 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d  r hand, if bComm
1d670 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  it is greater th
1d680 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65  an zero, then ke
1d690 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  ep.      ** loop
1d6a0 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65  ing until a free
1d6b0 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69  -page located wi
1d6c0 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e  thin the first n
1d6d0 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20  Fin pages.      
1d6e0 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1d6f0 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
1d700 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  /.      if( bCom
1d710 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1d720 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f    eMode = BTALLO
1d730 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e  C_LE;.        iN
1d740 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  ear = nFin;.    
1d750 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20    }.      do {. 
1d760 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1d770 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1d780 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1d790 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1d7a0 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1d7b0 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a   iNear, eMode);.
1d7c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d7d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d7e0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d7f0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1d800 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1d820 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1d830 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1d840 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20  }while( bCommit 
1d850 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
1d860 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1d870 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
1d880 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
1d890 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
1d8a0 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c  ge(pBt, pLastPg,
1d8b0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1d8c0 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d  , iFreePg, bComm
1d8d0 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  it);.      relea
1d8e0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d8f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d910 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d920 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d930 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d  ..  if( bCommit=
1d940 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =0 ){.    do {. 
1d950 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
1d960 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73      }while( iLas
1d970 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
1d980 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50  E_PAGE(pBt) || P
1d990 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1d9a0 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20  , iLastPg) );.  
1d9b0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1d9c0 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d  te = 1;.    pBt-
1d9d0 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67  >nPage = iLastPg
1d9e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1d9f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1da00 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ** The database 
1da10 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69  opened by the fi
1da20 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1da30 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
1da40 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67  atabase.** nOrig
1da50 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63   pages in size c
1da60 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20  ontaining nFree 
1da70 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75  free pages. Retu
1da80 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  rn the expected 
1da90 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20  .** size of the 
1daa0 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1dab0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61  s following an a
1dac0 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  uto-vacuum opera
1dad0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1dae0 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65  Pgno finalDbSize
1daf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1db00 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f  Pgno nOrig, Pgno
1db10 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e   nFree){.  int n
1db20 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20  Entry;          
1db30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1db40 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
1db50 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61  on one ptrmap pa
1db60 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74  ge */.  Pgno nPt
1db70 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  rmap;           
1db80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1db90 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65  r of PtrMap page
1dba0 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
1dbb0 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20  .  Pgno nFin;   
1dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
1dbe0 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20  ue */..  nEntry 
1dbf0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
1dc00 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d  e/5;.  nPtrmap =
1dc10 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
1dc20 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
1dc30 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f   nOrig)+nEntry)/
1dc40 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d  nEntry;.  nFin =
1dc50 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
1dc60 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20   nPtrmap;.  if( 
1dc70 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
1dc80 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
1dc90 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
1dca0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1dcb0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20     nFin--;.  }. 
1dcc0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
1dcd0 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29  SPAGE(pBt, nFin)
1dce0 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e   || nFin==PENDIN
1dcf0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1dd00 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a   ){.    nFin--;.
1dd10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46    }..  return nF
1dd20 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
1dd30 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1dd40 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
1dd50 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
1dd60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
1dd70 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
1dd80 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
1dd90 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
1dda0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1ddb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
1ddc0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1ddd0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
1dde0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
1ddf0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
1de00 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
1de10 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
1de20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
1de30 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1de40 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
1de50 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
1de60 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
1de70 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
1de80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1de90 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
1dea0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1deb0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1dec0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
1ded0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1dee0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
1def0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1df00 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1df10 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1df20 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1df30 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
1df40 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
1df50 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1df60 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
1df70 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1df80 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1df90 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
1dfa0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1dfb0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1dfc0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
1dfd0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1dfe0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1dff0 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c  ..    if( nOrig<
1e000 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  nFin ){.      rc
1e010 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1e020 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
1e030 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b  e if( nFree>0 ){
1e040 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
1e050 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1e060 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
1e070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e080 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69  {.        invali
1e090 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1e0a0 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20  ache(pBt);.     
1e0b0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1e0c0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1e0d0 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20  , nOrig, 0);.   
1e0e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1e0f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e110 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e120 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e130 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
1e140 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e150 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1e160 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1e170 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1e180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e190 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
1e1a0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1e1b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e1c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e1d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e1e0 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20  called prior to 
1e1f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1e200 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  it when a transa
1e210 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d  ction.** is comm
1e220 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  itted for an aut
1e230 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e240 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
1e250 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e260 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
1e270 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
1e280 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
1e290 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1e2a0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
1e2b0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
1e2c0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
1e2d0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
1e2e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1e2f0 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
1e300 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
1e310 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
1e320 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
1e330 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
1e340 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
1e350 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
1e360 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
1e370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
1e380 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1e390 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
1e3a0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
1e3b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1e3c0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29  count(pPager); )
1e3d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1e3e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e3f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e400 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
1e410 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
1e420 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
1e430 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
1e440 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
1e450 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
1e460 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
1e470 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e480 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
1e490 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
1e4a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
1e4b0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
1e4c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
1e4d0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
1e4e0 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
1e4f0 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
1e500 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
1e510 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
1e520 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  .    Pgno nOrig;
1e530 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1e540 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  ase size before 
1e550 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  freeing */..    
1e560 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
1e570 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
1e580 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
1e590 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c  GE(pBt, nOrig) |
1e5a0 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47  | nOrig==PENDING
1e5b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e5c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69  ){.      /* It i
1e5d0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
1e5e0 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62  o create a datab
1e5f0 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68  ase for which th
1e600 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20  e final page.   
1e610 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20     ** is either 
1e620 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
1e630 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e  ge or the pendin
1e640 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20  g-byte page. If 
1e650 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  one.      ** is 
1e660 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69  encountered, thi
1e670 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72  s indicates corr
1e680 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  uption..      */
1e690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e6a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e6b0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46  T;.    }..    nF
1e6c0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1e6d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e6e0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69  ta[36]);.    nFi
1e6f0 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e700 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e710 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  e);.    if( nFin
1e720 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
1e730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e740 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  KPT;.    if( nFi
1e750 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  n<nOrig ){.     
1e760 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1e770 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e780 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1e790 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65  Free=nOrig; iFre
1e7a0 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51  e>nFin && rc==SQ
1e7b0 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d  LITE_OK; iFree--
1e7c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  ){.      rc = in
1e7d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
1e7e0 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31  , nFin, iFree, 1
1e7f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1e800 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e   (rc==SQLITE_DON
1e810 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  E || rc==SQLITE_
1e820 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29  OK) && nFree>0 )
1e830 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1e840 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e850 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
1e860 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
1e870 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e880 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
1e890 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e8a0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e8b0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
1e8c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e8d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e8e0 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  [28], nFin);.   
1e8f0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1e900 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ate = 1;.      p
1e910 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
1e920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e940 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e950 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
1e960 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1e970 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d    assert( nRef>=
1e980 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e990 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1e9a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e9b0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
1e9c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e9d0 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
1e9e0 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
1e9f0 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
1ea00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ea10 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
1ea20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1ea30 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
1ea40 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
1ea50 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
1ea60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ea70 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
1ea80 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
1ea90 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
1eaa0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
1eab0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
1eac0 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
1ead0 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
1eae0 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
1eaf0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
1eb00 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
1eb10 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
1eb20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
1eb30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
1eb40 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
1eb50 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1eb60 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
1eb70 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
1eb80 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
1eb90 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
1eba0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
1ebb0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
1ebc0 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
1ebd0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
1ebe0 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
1ebf0 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
1ec00 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
1ec10 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
1ec20 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
1ec30 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
1ec40 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
1ec50 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
1ec60 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
1ec70 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1ec80 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
1ec90 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
1eca0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ecb0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
1ecc0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1ecd0 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
1ece0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
1ecf0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
1ed00 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
1ed10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
1ed20 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
1ed30 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
1ed40 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
1ed50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ed60 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
1ed70 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
1ed80 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
1ed90 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1eda0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1edb0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1edc0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
1edd0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
1ede0 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
1edf0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
1ee00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ee10 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
1ee20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1ee30 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
1ee40 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
1ee50 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
1ee60 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
1ee70 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
1ee80 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
1ee90 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
1eea0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
1eeb0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
1eec0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
1eed0 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
1eee0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
1eef0 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
1ef00 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
1ef10 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
1ef20 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
1ef30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1ef40 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1ef50 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
1ef60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ef70 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
1ef80 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1ef90 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
1efa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1efb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1efc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1efd0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1efe0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1eff0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1f000 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
1f010 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f020 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
1f030 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1f040 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
1f050 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
1f060 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f080 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1f090 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1f0a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f0c0 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  if( pBt->bDoTrun
1f0d0 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  cate ){.      sq
1f0e0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1f0f0 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
1f100 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ger, pBt->nPage)
1f110 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1f120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f130 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1f140 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
1f150 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
1f160 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1f170 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1f180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f190 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f1a0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
1f1b0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
1f1c0 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
1f1d0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
1f1e0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1f1f0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
1f200 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1f210 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
1f220 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
1f230 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1f240 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1f250 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
1f260 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
1f270 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1f280 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1f290 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1f2a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1f2b0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1f2c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
1f2d0 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
1f2e0 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62  NONE && db->nVdb
1f2f0 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f  eRead>1 ){.    /
1f300 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
1f310 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74  ther active stat
1f320 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f  ements that belo
1f330 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ng to this datab
1f340 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c  ase.    ** handl
1f350 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  e, downgrade to 
1f360 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
1f370 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68  saction. The oth
1f380 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20  er statements.  
1f390 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62    ** may still b
1f3a0 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
1f3b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  he database.  */
1f3c0 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c  .    downgradeAl
1f3d0 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
1f3e0 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70  eLocks(p);.    p
1f3f0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f400 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  S_READ;.  }else{
1f410 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68  .    /* If the h
1f420 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69  andle had any ki
1f430 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f  nd of transactio
1f440 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e  n open, decremen
1f450 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72  t the .    ** tr
1f460 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1f470 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
1f480 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
1f490 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20  saction count . 
1f4a0 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c     ** reaches 0,
1f4b0 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1f4c0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1f4d0 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42  ONE. The unlockB
1f4e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20  treeIfUnused(). 
1f4f0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77     ** call below
1f500 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
1f510 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20   pager.  */.    
1f520 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  if( p->inTrans!=
1f530 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1f540 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72      clearAllShar
1f550 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1f560 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  s(p);.      pBt-
1f570 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
1f580 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42  .      if( 0==pB
1f590 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
1f5a0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
1f5b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1f5c0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f5d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f5e0 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e  * Set the curren
1f5f0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  t transaction st
1f600 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1f610 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  E and unlock the
1f620 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69   .    ** pager i
1f630 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
1f640 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
1f650 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1f660 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70  ction.  */.    p
1f670 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
1f680 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f  S_NONE;.    unlo
1f690 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f6a0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
1f6b0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1f6c0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1f6d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f6e0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
1f6f0 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
1f700 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
1f710 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
1f720 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
1f730 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
1f740 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
1f750 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
1f760 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
1f770 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64   first phase and
1f780 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e   should.** be in
1f790 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63  voked prior to c
1f7a0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1f7b0 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ine.  The sqlite
1f7c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1f7d0 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  eOne().** routin
1f7e0 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f  e did all the wo
1f7f0 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
1f800 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
1f810 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
1f820 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
1f830 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
1f840 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
1f850 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
1f860 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
1f870 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
1f880 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
1f890 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20  runcate or zero 
1f8a0 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68  the header in th
1f8b0 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  e.** the rollbac
1f8c0 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68  k journal (which
1f8d0 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e   causes the tran
1f8e0 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69  saction to commi
1f8f0 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c  t) and.** drop l
1f900 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  ocks..**.** Norm
1f910 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1f920 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
1f930 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
1f940 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  s attempting to 
1f950 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65  .** finalize the
1f960 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72   underlying jour
1f970 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66  nal file, this f
1f980 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
1f990 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20  an error and.** 
1f9a0 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1f9b0 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72  will attempt a r
1f9c0 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72  ollback. However
1f9d0 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  , if the second 
1f9e0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e  argument.** is n
1f9f0 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69  on-zero then thi
1fa00 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63  s b-tree transac
1fa10 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
1fa20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a  a multi-file .**
1fa30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
1fa40 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
1fa50 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1fa60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
1fa70 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64  mitted .** (by d
1fa80 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72  eleting a master
1fa90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
1faa0 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  nd the caller wi
1fab0 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a  ll ignore this .
1fac0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  ** functions ret
1fad0 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76  urn code. So, ev
1fae0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
1faf0 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67  ccurs in the pag
1fb00 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73  er layer,.** res
1fb10 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62  et the b-tree ob
1fb20 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73  jects internal s
1fb30 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65  tate to indicate
1fb40 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a   that the write.
1fb50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  ** transaction h
1fb60 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20  as been closed. 
1fb70 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61  This is quite sa
1fb80 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72  fe, as the pager
1fb90 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72   will have.** tr
1fba0 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68  ansitioned to th
1fbb0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  e error state..*
1fbc0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1fbd0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1fbe0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1fbf0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1fc00 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1fc10 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1fc20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1fc30 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1fc40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fc50 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1fc60 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  o(Btree *p, int 
1fc70 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66  bCleanup){..  if
1fc80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1fc90 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72  ANS_NONE ) retur
1fca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
1fcb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1fcc0 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1fcd0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1fce0 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1fcf0 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
1fd00 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
1fd10 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
1fd20 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
1fd30 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
1fd40 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1fd50 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
1fd60 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1fd70 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fd80 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
1fd90 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1fda0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1fdb0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1fdc0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1fdd0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
1fde0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72  assert( pBt->nTr
1fdf0 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20  ansaction>0 );. 
1fe00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fe10 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1fe20 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  wo(pBt->pPager);
1fe30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fe40 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e  ITE_OK && bClean
1fe50 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  up==0 ){.      s
1fe60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1fe70 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
1fe80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1fe90 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d  p->iDataVersion-
1fea0 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74  -;  /* Compensat
1feb0 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44  e for pPager->iD
1fec0 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f  ataVersion++; */
1fed0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1fee0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1fef0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
1ff00 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1ff10 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1ff20 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1ff30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1ff40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1ff50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ff60 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1ff70 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1ff80 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1ff90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1ffa0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1ffb0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1ffc0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1ffd0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1ffe0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1fff0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
20000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20010 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
20020 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
20030 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
20040 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20050 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20060 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
20070 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
20080 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
20090 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
200a0 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
200b0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
200c0 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74  cursor on any Bt
200d0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
200e0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
200f0 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69  .  Or if the wri
20100 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73  teOnly flag is s
20110 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e  et to 1, then on
20120 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65  ly.** trip write
20130 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61   cursors and lea
20140 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ve read cursors 
20150 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
20160 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73   Every cursor is
20170 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
20180 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c  be tripped, incl
20190 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a  uding cursors.**
201a0 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
201b0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
201c0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
201d0 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20  happen to be.** 
201e0 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68  sharing the cach
201f0 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a  e with pBtree..*
20200 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20210 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68  e gets called wh
20220 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  en a rollback oc
20230 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69  curs. If the wri
20240 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69  teOnly.** flag i
20250 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c  s true, then onl
20260 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  y write-cursors 
20270 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20  need be tripped 
20280 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63  - read-only.** c
20290 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69  ursors save thei
202a0 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  r current positi
202b0 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  ons so that they
202c0 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a   may continue .*
202d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
202e0 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66  rollback. Or, if
202f0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20300 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  lse, all cursors
20310 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64   are .** tripped
20320 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72  . In general, wr
20330 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
20340 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
20350 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c  ion being.** rol
20360 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65  led back modifie
20370 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
20380 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63  chema. In this c
20390 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a  ase b-tree root.
203a0 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20  ** pages may be 
203b0 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64  moved or deleted
203c0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
203d0 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d  se altogether, m
203e0 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61  aking.** it unsa
203f0 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73  fe for read curs
20400 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e  ors to continue.
20410 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72  .**.** If the wr
20420 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
20430 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f  true and an erro
20440 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
20450 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e   while .** savin
20460 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
20470 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64  sition of a read
20480 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c  -only cursor, al
20490 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69  l cursors, .** i
204a0 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61  ncluding all rea
204b0 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  d-cursors are tr
204c0 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  ipped..**.** SQL
204d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
204e0 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
204f0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
20500 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a   occurs while.**
20510 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72   saving a cursor
20520 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51   position, an SQ
20530 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
20540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20550 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
20560 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
20570 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69  , int errCode, i
20580 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
20590 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
205a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
205b0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  OK;..  assert( (
205c0 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  writeOnly==0 || 
205d0 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26  writeOnly==1) &&
205e0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d   BTCF_WriteFlag=
205f0 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72  =1 );.  if( pBtr
20600 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
20610 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
20620 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  ee);.    for(p=p
20630 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
20640 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
20650 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
20660 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  ;.      if( writ
20670 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
20680 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
20690 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
206a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
206b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
206c0 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
206d0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
206e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
206f0 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
20700 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
20710 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20730 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
20740 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
20750 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
20760 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
20770 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
20780 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20790 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
207a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
207b0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
207c0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
207d0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
207e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
207f0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
20800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
20810 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
20820 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
20830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
20840 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
20850 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
20860 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
20870 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20880 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
20890 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
208a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
208b0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
208c0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
208d0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69  ss..**.** If tri
208e0 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
208f0 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73  ITE_OK then curs
20900 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61  ors will be inva
20910 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64  lidated (tripped
20920 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  )..** Only write
20930 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69   cursors are tri
20940 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
20950 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c  y is true but al
20960 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a  l cursors are.**
20970 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
20980 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20  eOnly is false. 
20990 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
209a0 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64  use.** a tripped
209b0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73   cursor will res
209c0 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
209d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
209e0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
209f0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
20a00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
20a10 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
20a20 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
20a30 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
20a40 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
20a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20a60 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
20a70 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
20a80 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
20a90 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
20aa0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20ab0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
20ac0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20  age *pPage1;..  
20ad0 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c  assert( writeOnl
20ae0 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==1 || writeOnl
20af0 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  y==0 );.  assert
20b00 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20b10 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
20b20 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53  K || tripCode==S
20b30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
20b40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20b50 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f  p);.  if( tripCo
20b60 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
20b70 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f  .    rc = tripCo
20b80 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  de = saveAllCurs
20b90 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
20ba0 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69      if( rc ) wri
20bb0 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65  teOnly = 0;.  }e
20bc0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
20bd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
20be0 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20  f( tripCode ){. 
20bf0 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c     int rc2 = sql
20c00 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20c10 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43  Cursors(p, tripC
20c20 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b  ode, writeOnly);
20c30 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
20c40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77  =SQLITE_OK || (w
20c50 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72  riteOnly==0 && r
20c60 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  c2==SQLITE_OK) )
20c70 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20c80 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
20c90 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  rc2;.  }.  btree
20ca0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
20cb0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20cc0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
20cd0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
20ce0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
20cf0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
20d00 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
20d10 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
20d20 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
20d30 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
20d40 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20d50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20d60 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
20d70 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
20d80 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
20d90 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
20da0 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
20db0 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
20dc0 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
20dd0 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
20de0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
20df0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
20e00 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
20e10 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
20e20 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
20e30 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
20e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
20e50 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
20e60 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
20e70 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
20e80 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
20e90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
20ea0 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
20eb0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
20ec0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
20ed0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
20ee0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
20ef0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
20f00 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20f10 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
20f20 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
20f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20f40 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
20f50 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30  rsors(pBt, 1)==0
20f60 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   );.    pBt->inT
20f70 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20f80 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20f90 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20fa0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20fb0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20fc0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20fd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20ff0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
21000 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21010 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
21020 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65  ansaction can be
21030 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
21040 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
21050 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
21060 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
21070 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
21080 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
21090 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
210a0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
210b0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
210c0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
210d0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
210e0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
210f0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
21100 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
21110 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
21120 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
21130 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
21140 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
21150 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
21160 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
21170 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
21180 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
21190 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
211a0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
211b0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
211c0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
211d0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
211e0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
211f0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
21200 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
21210 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21220 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
21230 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
21240 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
21250 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
21260 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
21270 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
21280 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
21290 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
212a0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
212b0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
212c0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
212d0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
212e0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
212f0 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
21300 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
21310 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
21320 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
21330 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
21340 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
21350 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
21360 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
21370 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21380 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
21390 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
213a0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
213b0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
213c0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
213d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
213e0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
213f0 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
21400 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
21410 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21420 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
21430 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
21450 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
21460 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
21470 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
21480 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
21490 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
214a0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
214b0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
214c0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
214d0 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
214e0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
214f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21500 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
21510 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
21520 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
21530 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
21540 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
21550 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
21560 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
21570 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
21580 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
21590 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
215a0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
215b0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
215c0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
215d0 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
215e0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
215f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
21600 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
21610 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
21620 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
21630 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
21640 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21650 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
21660 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21670 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
21680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
21690 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
216a0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
216b0 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
216c0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
216d0 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
216e0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
216f0 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
21700 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
21710 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
21720 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
21730 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
21740 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
21750 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
21760 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
21770 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
21780 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
21790 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
217a0 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
217b0 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
217c0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
217d0 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
217e0 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
217f0 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
21800 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
21810 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
21820 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
21830 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
21840 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
21850 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
21860 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
21870 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
21880 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
21890 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
218a0 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
218b0 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
218c0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
218d0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
218e0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
218f0 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
21910 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
21920 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21930 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
21940 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21950 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
21960 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
21970 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
21980 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
21990 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
219a0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
219b0 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
219c0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
219d0 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
219e0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
219f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21a00 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
21a10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
21a20 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
21a30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
21a50 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
21a60 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
21a70 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
21a80 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
21a90 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21aa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21ab0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
21ac0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
21ad0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
21ae0 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
21af0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
21b00 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
21b10 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
21b20 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
21b30 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
21b40 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
21b50 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
21b60 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
21b70 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
21b80 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
21b90 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
21ba0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
21bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
21bc0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
21bd0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
21be0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21bf0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21c00 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
21c10 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
21c20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
21c30 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
21c40 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
21c50 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
21c60 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
21c70 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
21c80 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
21c90 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
21ca0 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
21cb0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21cc0 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
21cd0 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
21ce0 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
21cf0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21d00 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
21d10 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
21d20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
21d30 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21d40 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
21d50 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
21d60 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
21d70 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
21d80 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
21d90 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21da0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
21db0 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
21dc0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
21dd0 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
21de0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
21df0 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
21e00 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
21e10 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
21e20 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
21e30 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
21e40 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
21e50 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
21e60 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
21e70 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
21e80 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
21e90 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
21ea0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
21eb0 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
21ec0 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
21ed0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
21ee0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
21ef0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
21f00 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
21f10 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
21f20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
21f30 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
21f40 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
21f50 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
21f60 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
21f70 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
21f80 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
21f90 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
21fa0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
21fb0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
21fc0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
21fd0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
21fe0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
21ff0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
22000 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22010 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
22020 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
22030 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
22040 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
22050 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
22060 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
22070 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
22080 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
22090 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
220a0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
220b0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
220c0 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
220d0 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
220e0 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
220f0 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
22100 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
22110 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
22120 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
22130 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
22140 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
22150 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
22160 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
22170 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
22180 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
22190 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
221a0 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
221b0 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
221c0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
221d0 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
221e0 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
221f0 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
22200 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
22210 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
22220 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
22230 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
22240 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
22250 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
22260 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
22270 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
22280 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
22290 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
222a0 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
222b0 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
222c0 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
222d0 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
222e0 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
222f0 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
22300 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
22310 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
22320 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
22330 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
22340 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
22350 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
22360 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
22370 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
22380 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
22390 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
223a0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
223b0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
223c0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
223d0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
223e0 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
223f0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
22400 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
22410 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
22420 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
22430 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
22440 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
22450 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
22460 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
22490 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
224c0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
224d0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
224e0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
22510 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
22520 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
22530 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
22540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
22550 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
22560 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
22570 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
22580 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
22590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
225a0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
225b0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
225c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
225d0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
225e0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
225f0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
22600 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
22630 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
22640 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
22650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
22660 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
22670 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22680 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
22690 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
226a0 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
226b0 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
226c0 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
226d0 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
226e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
226f0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
22700 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
22710 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
22720 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
22730 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
22740 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
22750 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
22760 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
22770 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
22780 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
22790 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
227a0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
227b0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
227c0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
227d0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
227e0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
227f0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
22800 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
22810 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
22820 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22830 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
22840 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
22850 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
22860 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
22870 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
22880 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
22890 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
228a0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
228b0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
228c0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
228d0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
228e0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
228f0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
22900 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
22910 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
22920 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22930 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
22940 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22950 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
22960 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
22970 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
22980 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
22990 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
229a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
229b0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
229c0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
229d0 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
229e0 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
229f0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22a00 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
22a10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22a20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
22a30 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
22a40 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
22a50 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
22a60 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
22a70 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
22a80 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
22a90 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
22aa0 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
22ab0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
22ac0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
22ad0 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
22ae0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
22af0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
22b00 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
22b10 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
22b20 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
22b30 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
22b40 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
22b50 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
22b60 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
22b70 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
22b80 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
22b90 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
22ba0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
22bb0 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
22bc0 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
22bd0 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
22be0 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
22bf0 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
22c00 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
22c10 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
22c20 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
22c30 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
22c40 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
22c50 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
22c60 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
22c70 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
22c80 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
22c90 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
22ca0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
22cb0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
22cc0 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
22cd0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
22ce0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
22cf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
22d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22d10 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
22d20 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
22d30 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22d60 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
22d70 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
22d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
22da0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
22db0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
22dc0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
22df0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
22e00 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
22e10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22e30 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
22e40 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
22e50 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
22e60 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
22e90 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
22ea0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
22eb0 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
22ec0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
22ed0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
22ee0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
22ef0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
22f00 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
22f10 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
22f20 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
22f30 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
22f40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
22f50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22f60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22f70 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
22f80 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
22f90 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
22fa0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
22fb0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
22fc0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
22fd0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
22fe0 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
22ff0 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
23000 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
23010 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
23020 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
23030 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
23040 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
23050 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
23060 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
23070 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
23080 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23090 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
230a0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
230b0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
230c0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
230d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
230e0 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
230f0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
23100 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
23120 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
23130 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
23140 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
23150 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
23160 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
23170 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
23180 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
23190 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
231a0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
231b0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
231c0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
231d0 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
231e0 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
231f0 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
23200 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
23210 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
23220 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23230 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
23240 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
23250 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
23260 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
23270 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
23280 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
23290 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
232a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
232b0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
232c0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
232d0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
232e0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
232f0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
23300 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
23310 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
23320 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
23330 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
23340 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
23350 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
23360 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
23370 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
23380 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
23390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
233a0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
233b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
233c0 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a  ->pCursor!=0 );.
233d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75      if( pBt->pCu
233e0 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20  rsor==pCur ){.  
233f0 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
23400 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
23410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23420 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76   BtCursor *pPrev
23430 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
23440 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
23450 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e     if( pPrev->pN
23460 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  ext==pCur ){.   
23470 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e         pPrev->pN
23480 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  ext = pCur->pNex
23490 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  t;.          bre
234a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
234b0 20 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50        pPrev = pP
234c0 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  rev->pNext;.    
234d0 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53    }while( ALWAYS
234e0 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d  (pPrev) );.    }
234f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23500 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
23510 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
23520 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
23530 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
23540 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
23550 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
23560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
23570 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
23580 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72     /* sqlite3_fr
23590 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20  ee(pCur); */.   
235a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
235b0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
235c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
235d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
235e0 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72  e sure the BtCur
235f0 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  sor* given in th
23600 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  e argument has a
23610 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73   valid.** BtCurs
23620 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72  or.info structur
23630 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
23640 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20   already valid, 
23650 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72  call.** btreePar
23660 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c  seCell() to fill
23670 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74   it in..**.** Bt
23680 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61  Cursor.info is a
23690 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e   cache of the in
236a0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
236b0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a   current cell..*
236c0 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63  * Using this cac
236d0 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e  he reduces the n
236e0 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74  umber of calls t
236f0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
23700 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ()..*/.#ifndef N
23710 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
23720 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  oid assertCellIn
23730 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
23740 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f  r){.    CellInfo
23750 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69   info;.    int i
23760 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
23770 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ge;.    memset(&
23780 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
23790 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
237a0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
237b0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20  >apPage[iPage], 
237c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
237d0 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  e], &info);.    
237e0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
237f0 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e  DB || memcmp(&in
23800 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
23810 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
23820 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
23830 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
23840 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
23850 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  f.static SQLITE_
23860 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65  NOINLINE void ge
23870 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
23880 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28  or *pCur){.  if(
23890 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
238a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e==0 ){.    int 
238b0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
238c0 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  age;.    pCur->c
238d0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
238e0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
238f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
23900 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23910 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
23920 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
23930 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
23940 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
23950 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
23960 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
23970 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
23980 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
23990 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
239a0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
239b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
239c0 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
239d0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
239e0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
239f0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
23a00 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
23a10 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
23a20 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
23a30 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
23a40 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
23a50 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
23a60 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
23a70 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
23a80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
23a90 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
23aa0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23ab0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
23ac0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23ad0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
23ae0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
23af0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
23b00 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
23b10 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
23b20 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
23b30 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
23b40 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
23b50 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
23b60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
23b70 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
23b80 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
23b90 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
23ba0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
23bb0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
23bc0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
23bd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
23be0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
23bf0 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
23c00 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23c10 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
23c20 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
23c30 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
23c40 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
23c50 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
23c60 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
23c70 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
23c80 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
23c90 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
23ca0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
23cb0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
23cc0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23cd0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
23ce0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23cf0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23d00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23d10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23d20 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
23d30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23d40 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
23d50 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65  >info.nKey;.  re
23d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23d70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
23d80 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
23d90 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
23da0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
23db0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
23dc0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
23dd0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
23de0 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
23df0 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
23e00 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
23e10 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
23e20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
23e30 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
23e40 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
23e50 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
23e60 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
23e70 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
23e80 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
23e90 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
23ea0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
23eb0 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
23ec0 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
23ed0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
23ee0 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
23ef0 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
23f00 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
23f10 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
23f20 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
23f30 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
23f40 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
23f50 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
23f60 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
23f70 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
23f80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23f90 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
23fa0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
23fb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
23fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23fd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23fe0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23ff0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
24000 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
24010 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
24020 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
24030 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24040 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24050 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65  iPage]->intKeyLe
24060 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65  af==1 );.  getCe
24070 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
24080 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
24090 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  nfo.nPayload;.  
240a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
240b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
240c0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
240d0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
240e0 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
240f0 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
24100 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
24110 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
24120 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
24130 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
24140 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
24150 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
24160 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
24170 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
24180 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
24190 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
241a0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
241b0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
241c0 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
241d0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
241e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
241f0 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
24200 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24210 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
24220 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
24230 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
24240 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
24250 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
24260 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
24270 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
24280 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
24290 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
242a0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
242b0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
242c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
242d0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
242e0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
242f0 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
24300 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
24310 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
24320 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
24330 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
24340 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
24350 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
24360 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
24370 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
24380 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
24390 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
243a0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
243b0 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
243c0 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
243d0 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
243e0 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
243f0 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
24400 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
24410 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
24420 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
24430 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
24440 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
24450 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
24460 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
24470 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
24480 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
24490 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
244a0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
244b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
244c0 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
244d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
244e0 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
244f0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
24500 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
24510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24520 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
24530 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
24540 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
24550 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
24560 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
24570 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
24580 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
24590 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
245a0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
245b0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
245c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
245d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
245e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
245f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
24600 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
24610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
24620 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
24630 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
24640 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
24650 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
24660 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
24670 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
24680 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
24690 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
246a0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
246b0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
246c0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
246d0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
246e0 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
246f0 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
24700 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
24710 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
24720 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
24730 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
24740 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
24750 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
24760 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
24770 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
24780 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
24790 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
247a0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
247b0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
247c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
247d0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
247e0 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
247f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
24800 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
24810 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
24820 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63  uess<=btreePagec
24830 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
24840 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
24850 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
24860 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
24870 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
24880 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
24890 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
248a0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
248b0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
248c0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
248d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
248e0 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
248f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
24900 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20  assert( next==0 
24910 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  || rc==SQLITE_DO
24920 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  NE );.  if( rc==
24930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24940 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
24950 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
24960 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30  Page, (ppPage==0
24970 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  ) ? PAGER_GET_RE
24980 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
24990 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
249a0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
249b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
249c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
249d0 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34       next = get4
249e0 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
249f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  a);.    }.  }.. 
24a00 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65   *pPgnoNext = ne
24a10 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65  xt;.  if( ppPage
24a20 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20   ){.    *ppPage 
24a30 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65  = pPage;.  }else
24a40 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
24a50 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
24a60 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
24a70 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45  TE_DONE ? SQLITE
24a80 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  _OK : rc);.}../*
24a90 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72  .** Copy data fr
24aa0 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61  om a buffer to a
24ab0 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61   page, or from a
24ac0 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65   page to a buffe
24ad0 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61  r..**.** pPayloa
24ae0 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  d is a pointer t
24af0 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e  o data stored on
24b00 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
24b10 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72  DbPage..** If ar
24b20 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61  gument eOp is fa
24b30 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20  lse, then nByte 
24b40 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72  bytes of data ar
24b50 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d  e copied.** from
24b60 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65   pPayload to the
24b70 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
24b80 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65  at by pBuf. If e
24b90 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74  Op is true,.** t
24ba0 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  hen sqlite3Pager
24bb0 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
24bc0 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64  d on pDbPage and
24bd0 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20   nByte bytes.** 
24be0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
24bf0 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  ed from the buff
24c00 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c  er pBuf to pPayl
24c10 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  oad..**.** SQLIT
24c20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
24c30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68   on success, oth
24c40 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
24c50 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
24c60 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  int copyPayload(
24c70 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61  .  void *pPayloa
24c80 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
24c90 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
24ca0 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
24cb0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
24cc0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24cd0 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  o buffer */.  in
24ce0 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
24cf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24d00 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f  r of bytes to co
24d10 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c  py */.  int eOp,
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66    /* 0 -> copy f
24d40 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63  rom page, 1 -> c
24d50 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  opy to page */. 
24d60 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
24d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
24d80 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50  ge containing pP
24d90 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69  ayload */.){.  i
24da0 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a  f( eOp ){.    /*
24db0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24dc0 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28  buffer to page (
24dd0 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  a write operatio
24de0 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63  n) */.    int rc
24df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24e00 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
24e10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
24e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
24e30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24e40 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
24e50 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  ad, pBuf, nByte)
24e60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
24e70 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
24e80 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20   page to buffer 
24e90 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  (a read operatio
24ea0 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79  n) */.    memcpy
24eb0 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c  (pBuf, pPayload,
24ec0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72   nByte);.  }.  r
24ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24ee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
24ef0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
24f00 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77  to read or overw
24f10 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66  rite payload inf
24f20 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  ormation.** for 
24f30 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
24f40 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  he pCur cursor i
24f50 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54  s pointing to. T
24f60 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65  he eOp.** argume
24f70 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  nt is interprete
24f80 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
24f90 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65  .**   0: The ope
24fa0 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
24fb0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24fc0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24fd0 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61  *   1: The opera
24fe0 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e  tion is a write.
24ff0 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
25000 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
25010 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74     2: The operat
25020 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44  ion is a read. D
25030 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74  o not populate t
25040 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
25050 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  e..**.** A total
25060 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
25070 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
25080 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
25090 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
250a0 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
250b0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
250c0 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
250d0 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
250e0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
250f0 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
25100 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
25110 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
25120 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
25130 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
25140 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
25150 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72  rent cursor entr
25160 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
25170 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
25180 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70  s and the.** eOp
25190 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
251a0 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f   2, this functio
251b0 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
251c0 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
251d0 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65  ily .** populate
251e0 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
251f0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
25200 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
25210 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
25220 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
25230 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
25240 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
25250 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
25260 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
25270 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
25280 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
25290 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
252a0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
252b0 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a  ted, it may be.*
252c0 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66  * invalidated if
252d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73   some other curs
252e0 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  or writes to the
252f0 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20   same table, or 
25300 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  if.** the cursor
25310 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64   is moved to a d
25320 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64  ifferent row. Ad
25330 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61  ditionally, in a
25340 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f  uto-vacuum.** mo
25350 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  de, the followin
25360 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76  g events may inv
25370 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66  alidate an overf
25380 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
25390 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  che..**.**   * A
253a0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
253b0 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63  cuum,.**   * A c
253c0 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61  ommit in auto_va
253d0 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65  cuum="full" mode
253e0 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e  ,.**   * Creatin
253f0 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72  g a table (may r
25400 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e  equire moving an
25410 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e   overflow page).
25420 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
25430 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20  ccessPayload(.  
25440 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25450 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
25460 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
25470 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
25480 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20  .  u32 offset,  
25490 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
254a0 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61   reading this fa
254b0 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a  r into payload *
254c0 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20  /.  u32 amt,    
254d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64           /* Read
254e0 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
254f0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
25500 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72  har *pBuf, /* Wr
25510 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e  ite the bytes in
25520 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
25530 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  / .  int eOp    
25540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
25550 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
25560 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
25570 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
25580 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
25590 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
255a0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  _OK;.  int iIdx 
255b0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
255c0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
255d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
255e0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
255f0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
25600 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
25610 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
25620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25630 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
25640 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
25650 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  to */.#ifdef SQL
25660 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25670 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67  LOW_READ.  unsig
25680 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74  ned char * const
25690 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75   pBufStart = pBu
256a0 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20  f;.  int bEnd;  
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
256d0 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
256e0 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61  g to end of data
256f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   */.#endif..  as
25700 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
25710 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25720 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25730 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25740 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25750 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
25760 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
25770 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25780 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25790 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c  assert( eOp!=2 |
257a0 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  | offset==0 );  
257b0 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72    /* Always star
257c0 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67  t from beginning
257d0 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a   for eOp==2 */..
257e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
257f0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
25800 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
25810 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51  yload;.#ifdef SQ
25820 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25830 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
25840 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70   = offset+amt==p
25850 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25860 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  ad;.#endif.  ass
25870 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
25880 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
25890 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28  ayload );..  if(
258a0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
258b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
258c0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
258d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29  t->usableSize] )
258e0 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
258f0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
25900 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
25910 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
25920 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
25930 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25940 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
25950 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
25960 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
25970 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
25980 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
25990 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
259a0 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
259b0 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
259c0 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
259d0 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
259e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
259f0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
25a00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
25a10 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
25a20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
25a30 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
25a40 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65  et], pBuf, a, (e
25a50 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67  Op & 0x01), pPag
25a60 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
25a70 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
25a80 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
25a90 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
25aa0 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
25ab0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
25ac0 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20  al;.  }...  if( 
25ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25ae0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
25af0 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65  nst u32 ovflSize
25b00 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
25b10 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
25b20 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
25b30 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
25b40 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
25b50 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
25b60 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
25b70 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
25b80 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  al]);..    /* If
25b90 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
25ba0 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f  verflow[] has no
25bb0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
25bc0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
25bd0 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74  w..    ** Except
25be0 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  , do not allocat
25bf0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f  e aOverflow[] fo
25c00 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a  r eOp==2..    **
25c10 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
25c20 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
25c30 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
25c40 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
25c50 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
25c60 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
25c70 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
25c80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
25c90 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
25ca0 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
25cb0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
25cc0 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
25cd0 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
25ce0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
25cf0 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
25d00 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
25d10 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
25d20 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
25d30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f     */.    if( eO
25d40 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63  p!=2 && (pCur->c
25d50 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
25d60 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
25d70 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
25d80 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
25d90 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
25da0 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
25db0 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
25dc0 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70       if( nOvfl>p
25dd0 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20  Cur->nOvflAlloc 
25de0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
25df0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
25e00 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
25e10 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
25e20 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
25e30 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
25e40 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
25e50 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
25e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
25e70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25e80 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
25e90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
25ea0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d  ur->nOvflAlloc =
25eb0 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20   nOvfl*2;.      
25ec0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
25ed0 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  low = aNew;.    
25ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25f00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25f10 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
25f20 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
25f30 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
25f40 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
25f50 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
25f60 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
25f70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25f80 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
25f90 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25fa0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
25fb0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
25fc0 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
25fd0 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
25fe0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
25ff0 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
26000 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
26010 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
26020 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
26030 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
26040 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20  vfl)!=0.     && 
26050 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26060 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
26070 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49  .    ){.      iI
26080 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
26090 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
260a0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
260b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
260c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
260d0 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
260e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
260f0 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
26100 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
26110 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
26120 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  ..      /* If re
26130 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
26140 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
26150 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
26160 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  /.      if( (pCu
26170 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
26180 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
26190 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
261a0 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
261b0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
261c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
261d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
261e0 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a  iIdx]==nextPage.
261f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26200 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
26210 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
26220 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
26230 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
26240 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66   }..      if( of
26250 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29  fset>=ovflSize )
26260 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
26270 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20   only reason to 
26280 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69  read this page i
26290 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  s to obtain the 
262a0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
262b0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e  number for the n
262c0 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
262d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
262e0 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  The page.       
262f0 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20   ** data is not 
26300 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72  required. So fir
26310 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70  st try to lookup
26320 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20   the overflow.  
26330 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69        ** page-li
26340 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79  st cache, if any
26350 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b  , then fall back
26360 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66   to the getOverf
26370 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20  lowPage().      
26380 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20    ** function.. 
26390 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
263a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
263b0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
263c0 72 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c  rray must be all
263d0 6f 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65  ocated because e
263e0 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a  Op!=2.        **
263f0 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d   here.  If eOp==
26400 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d  2, then offset==
26410 30 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63  0 and this branc
26420 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e  h is never taken
26430 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26440 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
26450 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=2 );.        a
26460 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
26470 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
26480 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20  idOvfl );.      
26490 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
264a0 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d  pBtree->db==pBt-
264b0 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >db );.        i
264c0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
264d0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
264e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
264f0 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
26500 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
26510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26520 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
26530 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
26540 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
26550 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
26560 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  }.        offset
26570 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20   -= ovflSize;.  
26580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26590 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65     /* Need to re
265a0 61 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f  ad this page pro
265b0 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69  perly. It contai
265c0 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20  ns some of the. 
265d0 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20         ** range 
265e0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20  of data that is 
265f0 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d  being read (eOp=
26600 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28  =0) or written (
26610 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20  eOp!=0)..       
26620 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
26630 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
26640 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73  W_READ.        s
26650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
26660 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
26670 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
26680 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
26690 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
266a0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
266b0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
266c0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
266d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
266e0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
266f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
26700 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
26710 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
26720 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26730 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
26740 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
26750 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
26760 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
26770 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
26780 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
26790 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
267a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
267b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
267c0 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
267d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
267e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65   there is no ope
267f0 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  n write-transact
26800 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ion, and.       
26810 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74   **   5) the dat
26820 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57  abase is not a W
26830 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20  AL database,.   
26840 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c       **   6) all
26850 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70   data from the p
26860 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61  age is being rea
26870 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d..        **   
26880 37 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  7) at least 4 by
26890 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
268a0 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
268b0 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
268c0 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
268d0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
268e0 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
268f0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
26900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26910 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
26920 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
26930 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
26940 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
26950 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
26960 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
26970 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
26980 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
26990 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
269a0 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
269b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f  .        if( (eO
269c0 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20  p&0x01)==0      
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
26a00 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
26a40 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
26a50 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53  bEnd || a==ovflS
26a60 69 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20  ize)            
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20    /* (6) */.    
26a90 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54       && pBt->inT
26aa0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
26ab0 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20  S_READ          
26ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34             /* (4
26ad0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26ae0 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61   (fd = sqlite3Pa
26af0 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61  gerFile(pBt->pPa
26b00 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20  ger))->pMethods 
26b10 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20      /* (3) */.  
26b20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70         && pBt->p
26b30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d  Page1->aData[19]
26b40 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20  ==0x01          
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b60 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (5) */.         
26b70 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42  && &pBuf[-4]>=pB
26b80 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20  ufStart         
26b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ba0 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a        /* (7) */.
26bb0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26bc0 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
26bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
26be0 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
26bf0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  4];.          as
26c00 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42  sert( aWrite>=pB
26c10 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20  ufStart );      
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c30 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20     /* hence (7) 
26c40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
26c50 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
26c60 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
26c70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
26c80 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
26c90 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
26ca0 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
26cb0 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
26cc0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
26cd0 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
26ce0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26cf0 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
26d00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
26d10 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
26d20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
26d30 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
26d40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26d50 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
26d60 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
26d70 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
26d80 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70             ((eOp
26d90 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45  &0x01)==0 ? PAGE
26da0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
26db0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
26dc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
26dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26de0 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
26df0 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
26e00 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
26e10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26e20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
26e30 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
26e40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26e50 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
26e60 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
26e70 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26  , pBuf, a, (eOp&
26e80 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b  0x01), pDbPage);
26e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26ea0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
26eb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26ec0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
26ed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
26ef0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
26f00 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
26f10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
26f20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26f30 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
26f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26f50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
26f60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
26f80 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
26f90 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
26fa0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
26fb0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
26fc0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
26fd0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
26fe0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
26ff0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
27000 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54  offset"..**.** T
27010 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
27020 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
27030 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27040 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e   valid row.** in
27050 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
27060 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
27070 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
27080 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
27090 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
270a0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
270b0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
270c0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
270d0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
270e0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
270f0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
27100 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
27110 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27120 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
27130 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
27140 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
27150 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27160 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27170 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
27180 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
27190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
271a0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
271b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
271c0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
271d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
271e0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
271f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27200 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
27210 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
27220 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
27230 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
27240 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
27250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
27260 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
27270 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
27280 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
27290 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
272a0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
272b0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
272c0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
272d0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
272e0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
272f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
27300 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
27310 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
27320 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
27330 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
27340 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
27350 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
27360 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
27370 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
27380 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
27390 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
273a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
273b0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
273c0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
273d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
273e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
273f0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
27400 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27410 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
27420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27430 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
27440 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27450 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
27460 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ed(pCur) );.  rc
27470 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
27480 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
27490 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
274a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
274b0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
274c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
274d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
274e0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
274f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27500 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
27510 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27520 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27530 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27540 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27550 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
27560 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27570 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
27580 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
27590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
275a0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
275b0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
275c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
275d0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
275e0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
275f0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
27600 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
27610 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
27620 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
27630 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
27640 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
27650 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
27660 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
27670 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
27680 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
27690 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
276a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
276b0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
276c0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
276d0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
276e0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
276f0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
27700 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
27710 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
27720 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
27730 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
27740 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
27750 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
27760 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
27770 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
27780 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
27790 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
277a0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
277b0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
277c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
277d0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
277e0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
277f0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
27800 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
27810 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
27820 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
27830 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
27840 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
27850 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
27860 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
27870 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
27880 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
27890 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
278a0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
278b0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
278c0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
278d0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
278e0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
278f0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
27900 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
27910 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
27920 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
27930 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
27940 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
27950 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
27960 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
27970 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
27980 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
27990 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
279a0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
279b0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
279c0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
279d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
279e0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
279f0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27a00 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
27a10 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  32 amt;.  assert
27a20 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
27a30 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27a40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27a50 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
27a60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27a70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27a90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27aa0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
27ab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
27ac0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
27ad0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
27ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27af0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27b00 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27b10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27b20 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
27b30 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
27b40 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
27b50 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
27b60 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50  ayload>pCur->apP
27b70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27b80 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
27b90 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
27ba0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
27bb0 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50  ayload<pCur->apP
27bc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27bd0 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
27be0 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
27bf0 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70  = (int)(pCur->ap
27c00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27c10 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  ]->aDataEnd - pC
27c20 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27c30 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  d);.  if( pCur->
27c40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20  info.nLocal<amt 
27c50 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  ) amt = pCur->in
27c60 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41  fo.nLocal;.  *pA
27c70 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75  mt = amt;.  retu
27c80 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
27c90 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
27ca0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
27cb0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
27cc0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
27cd0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
27ce0 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
27cf0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
27d00 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
27d10 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
27d20 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
27d30 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
27d40 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
27d50 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
27d60 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
27d70 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
27d80 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
27d90 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
27da0 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
27db0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
27dc0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
27dd0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
27de0 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
27df0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
27e00 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
27e10 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
27e20 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
27e30 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
27e40 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
27e50 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
27e60 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
27e70 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
27e80 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
27e90 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
27ea0 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
27eb0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
27ec0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
27ed0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
27ee0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
27ef0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
27f00 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
27f10 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
27f20 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
27f30 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
27f40 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
27f50 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
27f60 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
27f70 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
27f80 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
27f90 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
27fa0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
27fb0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
27fc0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
27fd0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
27fe0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
27ff0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
28000 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
28010 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
28020 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
28030 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
28040 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
28050 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
28060 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
28070 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
28080 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
28090 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
280a0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
280b0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
280c0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
280d0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
280e0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
280f0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
28100 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
28110 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
28120 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
28130 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
28140 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
28150 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
28160 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
28170 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28180 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
28190 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
281a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
281b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
281c0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
281d0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
281e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
281f0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
28200 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
28210 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
28220 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
28230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
28240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
28250 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
28260 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28270 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28280 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28290 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
282a0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
282b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
282c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a  ur->iPage] = 0;.
282d0 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49    return getAndI
282e0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
282f0 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50  Pgno, &pCur->apP
28300 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28320 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2c 20            pCur, 
28330 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
28340 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  ags);.}..#if SQL
28350 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
28360 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
28370 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
28380 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
28390 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
283a0 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
283b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
283c0 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
283d0 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
283e0 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
283f0 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
28400 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
28410 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
28420 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
28430 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
28440 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
28450 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
28460 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
28470 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
28480 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
28490 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
284a0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
284b0 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
284c0 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
284d0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
284e0 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
284f0 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
28500 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
28510 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
28530 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
28540 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
28550 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
28560 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
28570 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
28580 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
28590 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
285a0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
285b0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
285c0 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
285d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
285e0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
285f0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
28600 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
28610 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
28620 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
28630 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
28640 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
28650 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28660 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
28670 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
28680 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
28690 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
286a0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
286b0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
286c0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
286d0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
286e0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
286f0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
28700 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
28710 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
28720 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
28730 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
28740 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
28750 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
28760 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
28770 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28780 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28790 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
287a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
287b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
287c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
287d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
287e0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
287f0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
28800 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
28810 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
28820 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
28830 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28840 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
28850 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28860 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
28870 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28880 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
28890 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
288a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
288b0 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
288c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
288d0 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
288e0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
288f0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
28900 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28910 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28920 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
28930 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
28940 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
28950 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
28960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
28970 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
28980 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
28990 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
289a0 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
289b0 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
289c0 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
289d0 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
289e0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
289f0 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
28a00 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
28a10 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
28a20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
28a30 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
28a40 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
28a50 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
28a60 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
28a70 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
28a80 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
28a90 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
28aa0 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
28ab0 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
28ac0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
28ad0 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
28ae0 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
28af0 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
28b00 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
28b10 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
28b20 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
28b30 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
28b40 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
28b50 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
28b60 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
28b70 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
28b80 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
28b90 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
28ba0 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
28bb0 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
28bc0 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
28bd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
28be0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
28bf0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
28c00 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
28c10 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
28c20 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
28c30 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
28c40 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
28c50 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
28c60 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
28c70 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
28c80 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
28c90 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
28ca0 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
28cb0 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
28cc0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
28cd0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
28ce0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
28cf0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
28d00 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
28d10 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28d20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
28d30 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
28d40 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
28d50 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
28d60 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
28d70 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
28d80 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
28d90 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
28da0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
28db0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
28dc0 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
28dd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
28de0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
28df0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
28e00 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
28e10 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f  _INVALID < CURSO
28e20 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
28e30 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
28e40 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53  R_VALID   < CURS
28e50 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28e60 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28e70 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52  OR_FAULT   > CUR
28e80 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28e90 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
28ea0 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
28eb0 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
28ec0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28ed0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
28ee0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28ef0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
28f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28f10 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
28f20 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d  >skipNext;.    }
28f30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
28f40 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
28f50 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
28f60 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b  Cur->iPage>=0 ){
28f70 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
28f80 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
28f90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28fa0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28fb0 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  e]!=0 );.      r
28fc0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
28fd0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
28fe0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
28ff0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
29000 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
29010 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
29020 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29030 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65  _INVALID;.    re
29040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
29060 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29070 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63  ==(-1) );.    rc
29080 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
29090 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
290a0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
290b0 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
290c0 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  ge[0],.         
290d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
290e0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
290f0 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
29100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29110 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
29120 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29130 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
29140 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29150 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
29160 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
29170 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
29180 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
29190 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
291a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
291b0 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
291c0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
291d0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
291e0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
291f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
29200 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
29210 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
29220 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
29230 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
29240 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
29250 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29260 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
29270 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
29280 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
29290 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
292a0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
292b0 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
292c0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
292d0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
292e0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
292f0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
29300 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
29310 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
29320 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
29330 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
29340 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
29350 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29360 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
29370 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
29380 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
29390 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
293a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
293b0 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
293c0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
293d0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
293e0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
293f0 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
29400 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
29410 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
29420 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29430 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
29440 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
29450 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
29460 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
29470 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
29480 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
29490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
294a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
294b0 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e  T;.  }..  pCur->
294c0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
294d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
294e0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
294f0 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
29500 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
29510 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29520 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70  dOvfl);..  if( p
29530 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
29540 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29550 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
29560 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
29570 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
29580 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
29590 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
295a0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
295b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
295c0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
295d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
295e0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
295f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29600 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29610 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
29620 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
29630 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
29640 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
29650 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29660 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29670 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
29680 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
29690 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
296a0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
296b0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
296c0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
296d0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
296e0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
296f0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
29700 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
29710 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
29720 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
29730 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
29740 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
29750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29760 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
29770 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29780 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
29790 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
297a0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
297b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
297c0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
297d0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
297e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
297f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29800 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
29810 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
29820 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29830 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29840 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
29850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
29860 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29870 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
29880 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
29890 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
298a0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
298b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
298c0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
298d0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
298e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
298f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
29900 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
29910 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
29920 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
29930 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
29940 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
29950 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
29960 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
29970 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
29980 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
29990 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
299a0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
299b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
299c0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
299d0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
299e0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
299f0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
29a00 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
29a10 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
29a20 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
29a30 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
29a40 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
29a50 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
29a60 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
29a70 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
29a80 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
29a90 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
29aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
29ab0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
29ac0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29ad0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
29ae0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29af0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
29b00 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
29b10 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29b20 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29b30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29b40 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b50 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29b60 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
29b70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29b80 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
29b90 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
29ba0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
29bb0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
29bc0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
29bd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29be0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
29bf0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
29c00 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
29c10 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
29c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
29c30 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
29c40 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
29c50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
29c60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29c70 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
29c80 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
29c90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29ca0 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
29cb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29cc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
29cd0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
29ce0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
29cf0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
29d00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
29d10 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
29d20 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
29d30 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
29d40 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
29d50 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
29d60 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
29d70 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
29d80 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
29d90 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
29da0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
29db0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
29dc0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
29dd0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29de0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
29df0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
29e00 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
29e10 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
29e20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
29e30 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
29e40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29e50 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
29e60 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29e70 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
29e80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29e90 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
29ea0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29eb0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29ec0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29ed0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
29ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29ef0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29f00 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
29f10 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
29f30 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29f40 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
29f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29f60 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
29f70 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
29f80 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29f90 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29fa0 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29fb0 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29fc0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29fd0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29fe0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29ff0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2a000 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2a010 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2a020 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
2a030 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
2a040 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2a050 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
2a060 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a070 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a0a0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a0b0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2a0c0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
2a0d0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
2a0e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
2a0f0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
2a100 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
2a110 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
2a120 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
2a130 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a140 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
2a150 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a160 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
2a170 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
2a180 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
2a190 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
2a1a0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
2a1b0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2a1c0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
2a1d0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
2a1e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
2a1f0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
2a200 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2a210 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
2a220 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
2a230 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
2a240 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2a250 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2a260 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
2a270 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a280 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
2a290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2a2a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a2b0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
2a2c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2a2d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a2e0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2a2f0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2a300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a310 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
2a320 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2a330 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2a340 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2a350 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2a360 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a370 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2a380 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2a390 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2a3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2a3b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2a3c0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2a3d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a3e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2a3f0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2a400 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a420 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a430 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2a440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a450 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2a460 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2a470 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2a480 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2a490 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2a4a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a4b0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2a4c0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2a4d0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2a4e0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2a4f0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2a500 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2a510 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2a520 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2a530 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2a540 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2a550 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2a560 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2a570 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2a580 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2a590 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2a5a0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2a5b0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2a5c0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2a5d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a5e0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2a5f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2a600 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2a610 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2a620 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2a630 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2a640 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2a650 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2a660 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2a670 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2a680 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2a690 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2a6a0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2a6b0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2a6c0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2a6d0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2a6e0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2a6f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2a700 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2a710 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2a720 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2a730 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2a740 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2a750 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2a760 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2a770 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2a780 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2a790 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2a7a0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2a7b0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a7c0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2a7d0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7f0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2a800 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2a810 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2a820 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2a830 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2a840 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a850 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a860 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a870 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2a880 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2a890 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2a8a0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2a8b0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a8c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a8d0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a8e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a8f0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2a900 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2a910 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2a920 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2a930 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2a940 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2a950 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2a960 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2a970 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2a980 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2a990 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2a9a0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2a9b0 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2a9c0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2a9d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2a9e0 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2a9f0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2aa00 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2aa10 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2aa20 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2aa30 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2aa40 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2aa50 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2aa60 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2aa70 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2aa80 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2aa90 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2aaa0 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2aac0 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2aad0 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2aae0 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2aaf0 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2ab00 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2ab10 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2ab20 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2ab30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ab40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2ab50 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2ab60 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2ab70 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2ab80 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2ab90 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2aba0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
2abb0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2abc0 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2abd0 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2abe0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2abf0 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2ac00 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2ac10 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2ac20 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2ac30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ac40 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2ac50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ac60 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2ac70 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
2ac80 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  curIntKey .  ){.
2ac90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2aca0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2acb0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2acc0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2acd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ace0 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2acf0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ad00 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2ad10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2ad20 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2ad30 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2ad40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ad50 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2ad60 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2ad70 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2ad80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2ad90 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2ada0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2adb0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2adc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2add0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2ade0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2adf0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2ae00 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2ae10 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2ae20 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2ae30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2ae40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ae50 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2ae60 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2ae70 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2ae80 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2ae90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2aea0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2aeb0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2aec0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2aed0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2aee0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2aef0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2af00 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2af10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2af20 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2af30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2af40 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2af50 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2af60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2af70 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2af80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2af90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2afa0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2afb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2afc0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2afd0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2afe0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2aff0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2b000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b010 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b020 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2b030 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2b040 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2b050 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2b060 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2b070 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2b080 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2b090 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2b0a0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2b0b0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2b0c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b0d0 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2b0e0 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2b110 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2b120 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2b130 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2b140 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2b150 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2b160 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2b170 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2b180 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2b190 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2b1a0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2b1b0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2b1c0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2b1d0 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2b1e0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2b1f0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2b200 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2b210 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2b220 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2b230 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2b240 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2b250 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2b260 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2b270 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2b280 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2b290 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2b2a0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2b2b0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2b2c0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2b2d0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2b2e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b2f0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2b300 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b310 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2b320 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2b330 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2b340 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2b350 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2b360 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2b370 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2b380 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2b390 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2b3a0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2b3b0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2b3c0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2b3d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b3e0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b3f0 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2b400 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2b410 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b420 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2b430 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2b440 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2b450 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2b460 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2b470 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2b480 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2b490 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2b4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b4b0 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2b4c0 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2b4d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b4e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b500 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2b510 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2b520 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b530 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2b540 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b550 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2b560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b570 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2b580 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b590 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2b5a0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2b5b0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2b5c0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2b5d0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2b5e0 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2b5f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b600 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b610 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2b620 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2b630 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2b640 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2b650 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b660 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2b670 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2b680 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b690 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b6a0 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b6b0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b6d0 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2b6e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b6f0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2b700 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b710 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2b720 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2b730 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b740 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
2b750 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b760 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b780 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2b790 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2b7a0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2b7b0 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2b7c0 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2b7d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b7e0 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2b7f0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2b800 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2b810 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2b820 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2b830 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2b840 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2b850 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2b860 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2b870 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2b880 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2b890 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2b8a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2b8b0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2b8c0 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2b8d0 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2b8e0 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2b8f0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2b900 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2b910 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2b920 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2b930 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2b940 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2b950 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2b960 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2b970 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2b980 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2b990 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2b9a0 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2b9b0 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2b9c0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2b9d0 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2b9e0 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2b9f0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2ba00 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2ba10 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2ba20 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2ba30 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2ba40 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2ba50 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2ba60 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2ba70 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2ba80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2ba90 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2baa0 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2bab0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2bac0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2bad0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2bae0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2baf0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2bb00 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2bb10 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2bb20 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2bb30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bb40 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2bb50 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2bb60 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2bb70 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2bb80 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2bb90 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2bba0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2bbb0 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2bbc0 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2bbd0 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2bbe0 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2bbf0 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2bc00 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2bc10 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2bc20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2bc30 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2bc40 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2bc50 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2bc60 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2bc70 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2bc80 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2bc90 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2bca0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2bcb0 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2bcc0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2bcd0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2bce0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2bcf0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2bd00 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2bd10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2bd20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bd30 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2bd40 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2bd50 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2bd60 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2bd70 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2bd80 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2bd90 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2bda0 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2bdb0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2bdc0 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2bdd0 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2bde0 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2bdf0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2be00 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2be10 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2be20 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2be30 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2be40 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2be50 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2be60 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2be70 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2be80 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2be90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2bea0 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2beb0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2bec0 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2bed0 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2bee0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2bef0 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2bf00 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2bf10 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2bf20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2bf30 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2bf40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2bf50 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2bf60 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2bf70 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2bf80 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2bf90 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2bfa0 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2bfb0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2bfc0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2bfd0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2bfe0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2bff0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2c000 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c010 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2c020 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2c030 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2c040 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2c050 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c060 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2c070 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2c080 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2c090 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c0a0 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2c0b0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2c0c0 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2c0d0 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2c0e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2c0f0 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2c100 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2c110 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2c120 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2c130 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2c140 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2c150 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c160 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c170 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c190 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2c1a0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2c1b0 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2c1c0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2c1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2c1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2c1f0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
2c200 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c210 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c230 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c240 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2c250 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
2c260 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
2c270 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
2c280 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c290 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
2c2a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2c2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2c2c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2c2d0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2c2e0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c2f0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2c310 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2c320 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
2c330 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2c340 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c350 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2c360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2c370 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
2c380 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
2c390 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
2c3a0 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
2c3b0 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
2c3c0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2c3d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
2c3e0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2c3f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2c400 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2c410 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2c420 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2c430 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c440 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2c450 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2c460 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2c470 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2c480 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2c490 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c4a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c4b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c4c0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c4d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c4e0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c4f0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2c500 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2c510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2c520 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c530 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c550 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2c560 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2c570 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2c580 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2c590 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2c5a0 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2c5b0 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2c5c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2c5d0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2c5e0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2c5f0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2c600 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c610 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2c620 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2c630 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2c640 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c650 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2c660 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2c670 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2c680 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2c690 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2c6a0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c6b0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2c6c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c6d0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2c6e0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c6f0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2c700 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2c710 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2c720 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2c730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c740 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c750 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2c760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c770 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2c780 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2c790 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2c7a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c7b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c7c0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2c7d0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2c7e0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2c7f0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2c800 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2c810 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2c820 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2c830 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2c840 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2c850 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2c860 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2c870 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2c880 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2c890 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2c8a0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2c8b0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2c8c0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2c8d0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2c8e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2c8f0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2c900 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2c910 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c920 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2c930 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2c940 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2c950 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2c960 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2c970 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2c980 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2c990 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2c9a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c9b0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2c9c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2c9d0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2c9e0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2c9f0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2ca00 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2ca10 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2ca20 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2ca30 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2ca40 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2ca50 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2ca60 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2ca70 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2ca80 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2ca90 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2caa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2cab0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2cac0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2cad0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2cae0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2caf0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2cb00 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2cb10 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2cb20 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2cb30 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2cb40 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2cb50 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2cb60 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2cb70 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2cb80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2cb90 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2cba0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2cbb0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2cbc0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2cbd0 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2cbe0 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2cbf0 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2cc00 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2cc10 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2cc20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2cc30 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2cc40 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2cc50 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2cc60 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2cc70 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2cc80 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2cc90 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2cca0 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2ccb0 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2ccc0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2ccd0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2cce0 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2ccf0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2cd00 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2cd10 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2cd20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2cd30 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2cd40 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2cd50 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2cd60 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2cd70 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2cd80 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2cd90 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2cda0 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2cdb0 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2cdc0 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2cdd0 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2cde0 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2cdf0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2ce00 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2ce10 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2ce20 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2ce30 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2ce40 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2ce50 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2ce60 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2ce70 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2ce80 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2ce90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2cea0 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2ceb0 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2cec0 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2ced0 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2cee0 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2cef0 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2cf00 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2cf10 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2cf20 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2cf30 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2cf40 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2cf50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2cf60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2cf70 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2cf80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2cf90 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2cfa0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2cfb0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2cfc0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2cfd0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2cfe0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2cff0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2d000 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2d010 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2d020 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2d030 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2d040 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2d050 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2d060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2d080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2d090 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2d0a0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2d0b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2d0c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d0d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2d0e0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d0f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
2d100 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d110 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d120 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
2d130 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
2d140 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
2d150 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d160 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
2d170 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
2d180 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2d190 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d1a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d1b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d1c0 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73   }.      pCur->s
2d1d0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2d1e0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20   }.  }..  pPage 
2d1f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d200 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2d210 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
2d220 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2d230 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d240 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
2d250 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2d260 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2d270 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2d280 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2d290 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2d2a0 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2d2b0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2d2c0 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2d2d0 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2d2e0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2d2f0 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2d300 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2d310 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2d320 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2d330 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2d340 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2d350 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2d360 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2d370 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2d380 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2d390 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2d3a0 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2d3b0 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2d3c0 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2d3d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d3e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d3f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2d400 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2d410 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2d420 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2d430 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2d440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2d450 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d460 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d470 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d480 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2d490 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2d4a0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2d4b0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2d4c0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2d4d0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2d4e0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2d4f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d500 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2d510 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2d520 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2d530 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d540 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2d550 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2d560 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
2d570 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2d580 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2d590 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2d5a0 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2d5b0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2d5c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2d5d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d5e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2d5f0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d600 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d620 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d630 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d640 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2d650 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2d660 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2d670 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65  int *pRes){.  Me
2d680 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2d690 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2d6a0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2d6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2d6c0 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2d6d0 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2d6e0 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2d6f0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d700 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d710 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d720 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e  ALID );.  pCur->
2d730 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2d740 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2d750 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2d760 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2d770 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  vfl);.  *pRes = 
2d780 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2d790 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2d7a0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2d7b0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2d7c0 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  s);.  pPage = pC
2d7d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d7e0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28  >iPage];.  if( (
2d7f0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
2d800 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61  ur->iPage])>=pPa
2d810 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2d820 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d830 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2d840 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
2d850 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2d860 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2d870 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2d880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d890 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d8a0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d8b0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pCur);.  }.}../
2d8c0 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75  *.** Step the cu
2d8d0 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b  rsor to the back
2d8e0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2d8f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2d900 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2d910 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2d920 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2d930 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2d940 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2d950 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
2d960 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2d970 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
2d980 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
2d990 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
2d9a0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
2d9b0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2d9c0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2d9d0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e  BtreePrevious().
2d9e0 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2d9f0 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2da00 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2da10 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63  se of merely dec
2da20 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2da30 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2da40 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2da50 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c  the previous cel
2da60 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2da70 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2da80 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f  wer) btreePrevio
2da90 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72  us().** helper r
2daa0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2dab0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2dac0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2dad0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2dae0 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f  e.** or to resto
2daf0 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2db00 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2db10 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2db20 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2db30 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2db40 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2db50 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2db60 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2db70 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2db80 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2db90 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2dba0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2dbb0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2dbc0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2dbd0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2dbe0 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2dbf0 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2dc00 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2dc10 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2dc20 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2dc30 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2dc40 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2dc50 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2dc60 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2dc70 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2dc80 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2dc90 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2dca0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2dcb0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2dcc0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2dcd0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2dce0 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2dcf0 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2dd00 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2dd10 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2dd20 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2dd30 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2dd40 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
2dd50 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
2dd60 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2dd70 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
2dd80 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2dd90 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2dda0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ddb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2ddc0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2ddd0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2dde0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2ddf0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2de00 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2de10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2de20 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2de30 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
2de40 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2de50 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2de60 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
2de70 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2de80 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
2de90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2dea0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2deb0 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2dec0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2ded0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2dee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2def0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2df00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2df10 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2df20 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2df30 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2df40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2df50 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2df60 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2df70 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2df80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2df90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2dfa0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2dfb0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2dfc0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2dfd0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2dfe0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2dff0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
2e000 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2e010 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e030 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e040 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2e050 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2e060 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2e070 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e080 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2e090 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e0a0 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
2e0b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e0c0 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
2e0d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e0e0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
2e0f0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e100 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2e110 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
2e120 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
2e140 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2e150 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2e160 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2e170 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e180 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
2e190 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e1a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e1b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e1c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e1d0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2e1e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e1f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e200 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2e210 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2e220 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e230 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e240 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e250 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2e260 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64  gs & (BTCF_Valid
2e270 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2e280 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2e290 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e2a0 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2e2b0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e2c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e2d0 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
2e2e0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e2f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e310 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2e320 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2e330 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e360 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e370 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e380 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e390 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72   *pRes){.  asser
2e3a0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2e3b0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2e3c0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2e3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2e3e0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2e3f0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2e400 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2e410 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2e420 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e430 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2e440 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2e450 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2e460 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2e470 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2e480 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2e490 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2e4a0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2e4b0 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2e4c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e4d0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2e4e0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2e4f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2e500 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2e510 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2e520 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2e530 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2e540 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2e550 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2e560 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e570 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2e580 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2e590 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2e5a0 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2e5b0 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2e5c0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2e5d0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2e5e0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2e5f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e600 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2e610 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2e620 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2e630 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2e640 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2e650 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2e660 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2e670 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2e680 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2e690 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2e6a0 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2e6b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2e6c0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2e6d0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2e6e0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2e6f0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2e700 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  .  *ppPage is se
2e710 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65  t to NULL in the
2e720 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72   event of an err
2e730 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
2e740 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
2e750 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
2e760 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20  en an effort is 
2e770 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
2e780 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
2e790 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
2e7a0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
2e7b0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
2e7c0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
2e7d0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
2e7e0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
2e7f0 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
2e800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
2e810 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
2e820 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
2e830 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
2e840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2e850 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69  Mode parameter i
2e860 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  s BTALLOC_EXACT 
2e870 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70  and the nearby p
2e880 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e  age exists.** an
2e890 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
2e8a0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
2e8b0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2e8c0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  o be returned.  
2e8d0 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42  If.** eMode is B
2e8e0 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74  TALLOC_LT then t
2e8f0 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64  he page returned
2e900 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68   will be less th
2e910 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
2e920 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20  o nearby if any 
2e930 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
2e940 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42  .  If eMode is B
2e950 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20  TALLOC_ANY then 
2e960 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
2e970 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20  restrictions on 
2e980 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65  which page is re
2e990 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2e9a0 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74  c int allocateBt
2e9b0 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  reePage(.  BtSha
2e9c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
2e9d0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
2e9e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
2e9f0 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74  Page,      /* St
2ea00 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ore pointer to t
2ea10 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2ea20 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  e here */.  Pgno
2ea30 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20   *pPgno,        
2ea40 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
2ea50 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65  page number here
2ea60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62   */.  Pgno nearb
2ea70 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
2ea80 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67  Search for a pag
2ea90 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20  e near this one 
2eaa0 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20  */.  u8 eMode   
2eab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2eac0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54  TALLOC_EXACT, BT
2ead0 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41  ALLOC_LT, or BTA
2eae0 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20  LLOC_ANY */.){. 
2eaf0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2eb00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
2eb10 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
2eb20 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
2eb30 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
2eb40 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
2eb50 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
2eb60 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
2eb70 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
2eb80 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
2eb90 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
2eba0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
2ebb0 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
2ebc0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
2ebd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2ebe0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
2ebf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ec00 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2ec10 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ec20 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ec30 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e  _ANY || (nearby>
2ec40 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56  0 && IfNotOmitAV
2ec50 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
2ec60 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  )) );.  pPage1 =
2ec70 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
2ec80 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  mxPage = btreePa
2ec90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
2eca0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2ecb0 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68  R-05119-02637 Th
2ecc0 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2ecd0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2ece0 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74  ffset 36.  ** st
2ecf0 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20  ores stores the 
2ed00 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2ed10 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ed20 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20  elist. */.  n = 
2ed30 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2ed40 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2ed50 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
2ed60 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
2ed70 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
2ed80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ed90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2eda0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2edb0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
2edc0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2edd0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
2ede0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
2edf0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
2ee00 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
2ee10 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
2ee20 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
2ee30 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
2ee40 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
2ee50 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20      u32 nSearch 
2ee60 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20  = 0;   /* Count 
2ee70 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
2ee80 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73   search attempts
2ee90 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20   */.    .    /* 
2eea0 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  If eMode==BTALLO
2eeb0 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75  C_EXACT and a qu
2eec0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
2eed0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
2eee0 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
2eef0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
2ef00 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
2ef10 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
2ef20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2ef30 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
2ef40 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
2ef50 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
2ef60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ef70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ef80 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2ef90 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20  OC_EXACT ){.    
2efa0 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78    if( nearby<=mx
2efb0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2efc0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2efd0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
2efe0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >0 );.        as
2eff0 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
2f000 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20  acuum );.       
2f010 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2f020 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
2f030 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ype, 0);.       
2f040 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2f050 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28   rc;.        if(
2f060 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2f070 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2f080 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f090 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2f0a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2f0b0 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
2f0c0 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20  LOC_LE ){.      
2f0d0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
2f0e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2f0f0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
2f100 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
2f110 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
2f120 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
2f130 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
2f140 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
2f150 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
2f160 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
2f170 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
2f180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f190 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f1a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2f1b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f1c0 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
2f1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2f1e0 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
2f1f0 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
2f200 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
2f210 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
2f220 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
2f230 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
2f240 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
2f250 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
2f260 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
2f270 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
2f280 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
2f290 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
2f2a0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
2f2b0 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
2f2c0 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a  LOC_EXACT).    *
2f2d0 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67  * or until a pag
2f2e0 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61  e less than 'nea
2f2f0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2f300 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2f310 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  LT).    */.    d
2f320 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
2f330 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
2f340 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
2f350 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
2f360 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2f370 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65  -01506-11053 The
2f380 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f   first integer o
2f390 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f3a0 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  nk page.        
2f3b0 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  ** is the page n
2f3c0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
2f3d0 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2f3e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
2f3f0 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  t or.        ** 
2f400 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
2f410 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73  the last freelis
2f420 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f  t trunk page. */
2f430 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2f440 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
2f450 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2f460 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2f470 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2f480 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d  NCE-OF: R-59841-
2f490 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65  13798 The 4-byte
2f4a0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2f4b0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32  ger at offset 32
2f4c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2f4d0 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  es the page numb
2f4e0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
2f4f0 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65  page of the free
2f500 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  list, or zero if
2f510 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2f520 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
2f530 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  y. */.        iT
2f540 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f550 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2f560 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
2f570 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72     testcase( iTr
2f580 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2f590 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e       if( iTrunk>
2f5a0 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63  mxPage || nSearc
2f5b0 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20  h++ > n ){.     
2f5c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f5d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f5f0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
2f600 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
2f610 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2f620 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2f630 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f640 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f650 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f660 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2f680 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2f690 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f6a0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2f6b0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
2f6c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
2f6d0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
2f6e0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
2f6f0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f700 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
2f710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
2f720 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
2f730 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
2f740 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
2f750 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2f760 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
2f770 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2f780 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2f790 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2f7a0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2f7b0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2f7c0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2f7d0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2f7e0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2f7f0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2f800 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2f810 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2f820 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2f830 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2f840 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2f850 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2f860 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f870 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2f880 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2f890 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2f8a0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f8b0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2f8c0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2f8d0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2f8e0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2f8f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2f900 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2f910 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2f920 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2f930 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2f940 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2f950 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2f960 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2f970 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2f980 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2f990 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2f9a0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2f9b0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2f9c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2f9d0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2f9e0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2f9f0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2fa00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2fa10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2fa20 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2fa30 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fa40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fa50 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fa60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2fa70 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2fa80 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2fa90 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2faa0 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2fab0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2fac0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2fad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2fae0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2faf0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2fb00 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2fb10 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2fb20 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2fb30 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2fb40 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2fb50 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2fb60 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2fb70 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2fb80 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2fb90 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2fba0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2fbb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2fbc0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2fbd0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2fbe0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fbf0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2fc00 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2fc10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2fc20 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2fc30 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2fc40 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2fc50 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2fc60 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2fc70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fc80 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2fc90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2fcb0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2fcc0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2fcd0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2fce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2fd00 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fd10 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fd20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2fd30 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2fd40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2fd50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2fd60 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2fd70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2fd80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2fd90 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2fda0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2fdb0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2fdc0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2fdd0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2fde0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2fdf0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2fe00 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2fe10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2fe20 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2fe30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2fe40 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2fe50 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2fe60 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2fe70 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2fe80 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2fe90 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2fea0 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2feb0 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2fec0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2fed0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2fee0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fef0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2ff00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2ff10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ff20 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2ff30 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2ff40 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2ff50 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
2ff60 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
2ff70 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
2ff80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ff90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ffa0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ffb0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ffc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ffd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ffe0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
2fff0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30000 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30010 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30020 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30030 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
30040 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30050 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30060 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
30070 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30080 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
30090 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
300a0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
300b0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
300c0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
300d0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
300e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
300f0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
30100 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
30110 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
30120 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
30130 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
30140 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
30150 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
30160 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
30170 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
30180 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
30190 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
301a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
301b0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
301c0 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
301d0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
301e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
301f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30200 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
30210 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
30220 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30230 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
30240 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30250 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30270 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30280 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
30290 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
302a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
302b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
302c0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
302d0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
302e0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
302f0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
30300 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
30310 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
30320 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
30330 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
30340 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
30350 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
30360 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
30370 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
30380 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
30390 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
303a0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
303b0 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
303c0 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
303d0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
303e0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
303f0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30400 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
30410 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
30420 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
30430 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
30440 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
30450 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
30460 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
30470 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
30480 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
30490 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
304a0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
304b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
304c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
304d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
304e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
304f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
30500 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
30510 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
30520 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
30530 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
30540 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
30550 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
30560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30570 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
30580 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
30590 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
305a0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
305b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
305c0 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
305e0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
305f0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
30600 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
30610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30620 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30630 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30640 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30650 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
30660 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
30670 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
30680 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
30690 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
306a0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
306b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
306c0 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
306d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
306e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
306f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
30700 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30710 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
30720 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
30730 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
30740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
30750 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
30760 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d       || (iPage==
30770 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65  nearby || (iPage
30780 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65  <nearby && eMode
30790 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a  ==BTALLOC_LE)) .
307a0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
307b0 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
307c0 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
307d0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
307e0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
307f0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
30800 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
30810 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
30830 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
30840 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
30850 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
30860 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
30870 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
30880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
30890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
308a0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
308b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
308c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
308d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
308e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
308f0 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
30900 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
30910 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
30920 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
30930 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
30940 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
30950 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
30960 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
30970 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
30980 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
30990 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f  nt(pBt, *pPgno)?
309a0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
309b0 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20  TENT : 0;.      
309c0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
309d0 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
309e0 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
309f0 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20   noContent);.   
30a00 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30a10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30a30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
30a40 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
30a50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
30a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30a80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
30a90 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  ppPage);.       
30aa0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
30ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
30ac0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
30ad0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30ae0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
30af0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
30b00 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
30b10 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70  vTrunk);.      p
30b20 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
30b30 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63     }while( searc
30b40 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  hList );.  }else
30b50 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
30b60 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74  re no pages on t
30b70 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20  he freelist, so 
30b80 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67  append a new pag
30b90 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
30ba0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
30bb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
30bc0 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65  rmally, new page
30bd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
30be0 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65  his block can be
30bf0 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20   requested from 
30c00 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
30c10 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
30c20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
30c30 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76  g set. This prev
30c40 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20  ents the pager. 
30c50 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
30c60 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  g to read the pa
30c70 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ges content from
30c80 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20   disk. However, 
30c90 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  if the.    ** cu
30ca0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
30cb0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75  n has already ru
30cc0 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e  n one or more in
30cd0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
30ce0 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74  .    ** steps, t
30cf0 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20  hen the page we 
30d00 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c  are about to all
30d10 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69  ocate may contai
30d20 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  n content.    **
30d30 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
30d40 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
30d50 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e  f a rollback. In
30d60 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20   this case, do. 
30d70 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68     ** not set th
30d80 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61  e no-content fla
30d90 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74  g. This causes t
30da0 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64  he pager to load
30db0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   and journal.   
30dc0 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
30dd0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66  page content bef
30de0 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20  ore overwriting 
30df0 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  it..    **.    *
30e00 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
30e10 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61  pager will not a
30e20 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20  ctually attempt 
30e30 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e  to load or journ
30e40 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65  al .    ** conte
30e50 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20  nt for any page 
30e60 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73  that really does
30e70 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e   lie past the en
30e80 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
30e90 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e  e.    ** file on
30ea0 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66   disk. So the ef
30eb0 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69  fects of disabli
30ec0 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  ng the no-conten
30ed0 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20  t optimization. 
30ee0 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63     ** here are c
30ef0 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65  onfined to those
30f00 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20   pages that lie 
30f10 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
30f20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  of the.    ** da
30f30 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64  tabase image and
30f40 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
30f60 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e     */.    int bN
30f70 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49  oContent = (0==I
30f80 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
30f90 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50  bDoTruncate))? P
30fa0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
30fb0 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20  NT:0;..    rc = 
30fc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30fd0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
30fe0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
30ff0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31000 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b  .    pBt->nPage+
31010 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  +;.    if( pBt->
31020 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
31030 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20  YTE_PAGE(pBt) ) 
31040 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23  pBt->nPage++;..#
31050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31060 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31070 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
31080 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f  acuum && PTRMAP_
31090 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
310a0 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  >nPage) ){.     
310b0 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65   /* If *pPgno re
310c0 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65  fers to a pointe
310d0 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f  r-map page, allo
310e0 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67  cate two new pag
310f0 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74  es.      ** at t
31100 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
31110 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  le instead of on
31120 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c  e. The first all
31130 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20  ocated page.    
31140 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e    ** becomes a n
31150 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  ew pointer-map p
31160 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  age, the second 
31170 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63  is used by the c
31180 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a  aller..      */.
31190 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
311a0 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  Pg = 0;.      TR
311b0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
311c0 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
311d0 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70  ile (pointer-map
311e0 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e   page)\n", pBt->
311f0 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61  nPage));.      a
31200 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
31210 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e!=PENDING_BYTE_
31220 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
31230 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31240 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31250 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
31260 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
31270 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
312a0 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
312b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
312c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
312d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
312e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
312f0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
31300 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
31310 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
31320 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31330 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
31340 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
31350 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
31360 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
31370 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
31380 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
31390 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
313a0 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
313b0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
313c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
313d0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
313e0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
313f0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
31400 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
31410 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
31420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
31430 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31440 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
31450 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
31460 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31470 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
31480 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
31490 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
314a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
314b0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
314c0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
314d0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
314e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
314f0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
31500 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31510 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
31520 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
31530 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
31540 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
31550 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74  Trunk);.  assert
31560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31570 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  || sqlite3PagerP
31580 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
31590 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c  Page)->pDbPage)<
315a0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
315b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
315c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
315d0 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  it==0 );.  retur
315e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
315f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31600 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
31610 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
31620 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
31630 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
31640 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
31650 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
31660 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
31670 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
31680 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
31690 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
316a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
316b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
316c0 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
316d0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
316e0 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
316f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
31700 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
31710 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
31720 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
31730 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
31740 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
31750 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
31760 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
31770 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
31780 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31790 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
317a0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
317b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
317c0 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
317d0 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
317e0 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
317f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
31800 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
31810 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31820 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
31830 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
31840 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
31850 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
31860 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
31870 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
31880 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
31890 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
318a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
318b0 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
318c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
318d0 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
318e0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
318f0 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
31900 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
31910 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
31920 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31940 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
31950 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
31960 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
31990 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
319a0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319c0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
319d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
319e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
319f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31a00 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
31a10 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
31a20 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
31a30 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
31a40 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
31a50 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
31a60 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
31a70 66 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74  f( iPage<2 ) ret
31a80 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31a90 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70  PT_BKPT;.  if( p
31aa0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
31ab0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
31ac0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
31ad0 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
31ae0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
31af0 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
31b00 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
31b10 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
31b20 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
31b30 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
31b40 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
31b50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31b60 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
31b70 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
31b80 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
31b90 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
31ba0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
31bb0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
31bc0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
31bd0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
31be0 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
31bf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
31c00 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
31c10 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
31c20 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
31c30 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
31c40 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
31c50 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
31c60 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
31c70 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
31c80 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
31c90 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
31ca0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
31cb0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
31cc0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
31cd0 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
31ce0 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
31cf0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
31d00 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
31d10 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
31d20 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31d30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
31d40 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
31d50 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
31d60 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
31d70 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
31d80 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
31d90 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
31da0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
31db0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
31dc0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
31dd0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
31de0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
31df0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
31e00 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
31e10 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
31e20 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
31e30 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
31e40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31e50 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
31e60 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
31e70 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
31e80 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
31e90 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
31ea0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
31eb0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
31ec0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
31ed0 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
31ee0 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
31ef0 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
31f00 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
31f10 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
31f20 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
31f30 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
31f40 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
31f50 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
31f60 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
31f70 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
31f80 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
31f90 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
31fa0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
31fb0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
31fc0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
31fd0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
31fe0 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
31ff0 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
32000 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
32010 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
32020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32030 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
32040 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
32050 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
32060 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
32070 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
32080 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
32090 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
320a0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
320b0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
320c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
320d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
320e0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
320f0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
32100 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
32110 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
32120 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
32130 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
32140 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
32150 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
32160 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
32170 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32180 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32190 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
321a0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
321b0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
321c0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
321d0 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
321e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
321f0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
32200 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
32210 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
32220 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
32230 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
32240 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
32250 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
32260 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
32270 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
32280 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
32290 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
322a0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
322b0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
322c0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
322d0 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
322e0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
322f0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
32300 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
32310 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
32320 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
32330 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
32340 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
32350 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
32360 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
32370 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
32380 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
32390 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
323a0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
323b0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
323c0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
323d0 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
323e0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
323f0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
32400 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
32410 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
32420 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
32430 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
32440 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
32450 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
32460 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
32470 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
32480 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
32490 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
324a0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
324b0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
324c0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
324d0 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
324e0 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
324f0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
32500 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
32510 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
32520 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
32530 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32540 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
32550 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77  -19920-11576 How
32560 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73  ever, newer vers
32570 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73  ions of SQLite s
32580 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76  till.      ** av
32590 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61  oid using the la
325a0 73 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69  st six entries i
325b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74  n the freelist t
325c0 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20  runk page array 
325d0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
325e0 72 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  r that database 
325f0 66 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79  files created by
32600 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
32610 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65  of SQLite can be
32620 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62  .      ** read b
32630 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
32640 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20   of SQLite..    
32650 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
32660 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32670 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
32680 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
32690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
326a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
326b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
326c0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
326d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
326e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
326f0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
32700 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
32710 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
32720 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
32730 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
32740 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32750 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
32760 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
32770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32780 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
32790 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
327a0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
327b0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
327c0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
327d0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
327e0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
327f0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
32800 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
32810 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
32820 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
32830 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
32840 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
32850 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
32860 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
32870 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
32880 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
32890 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
328a0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
328b0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
328c0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
328d0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
328e0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
328f0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
32900 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
32910 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
32920 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
32930 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
32940 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
32950 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
32960 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
32970 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
32980 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
32990 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
329a0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
329b0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
329c0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
329d0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
329e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
329f0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
32a00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32a10 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
32a20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
32a40 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32a50 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
32a60 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
32a70 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
32a80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
32a90 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
32aa0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32ab0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
32ac0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
32ad0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
32ae0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
32af0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32b00 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
32b10 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
32b20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
32b30 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
32b40 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
32b50 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
32b60 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
32b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
32b80 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
32b90 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
32ba0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
32bb0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
32bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
32bd0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
32be0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
32bf0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
32c00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
32c10 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
32c20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
32c30 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
32c40 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
32c50 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
32c60 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
32c70 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
32c80 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
32c90 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
32ca0 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
32cb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
32cc0 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
32cd0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
32ce0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
32cf0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
32d00 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32d10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
32d20 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
32d30 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
32d40 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
32d50 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
32d60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
32d70 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
32d80 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
32d90 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
32da0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
32db0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
32dc0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
32dd0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
32de0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
32df0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
32e00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
32e10 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
32e20 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
32e30 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
32e40 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
32e50 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
32e60 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
32e70 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66  info.nLocal==inf
32e80 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
32e90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32ea0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
32eb0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
32ec0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
32ed0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
32ee0 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
32ef0 2e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67 65  .nSize-1 > pPage
32f00 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
32f10 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
32f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
32f30 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
32f40 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
32f50 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
32f60 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
32f70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
32f80 2b 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34  + info.nSize - 4
32f90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
32fa0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
32fb0 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
32fc0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
32fd0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
32fe0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
32ff0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
33000 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
33010 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
33020 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76  e;.  assert( nOv
33030 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f  fl>0 || .    (CO
33040 52 52 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66  RRUPT_DB && (inf
33050 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66  o.nPayload + ovf
33060 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50  lPageSize)<ovflP
33070 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20  ageSize).  );.  
33080 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
33090 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
330a0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
330b0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
330c0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
330d0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
330e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
330f0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
33100 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
33110 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
33120 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
33130 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
33140 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
33150 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
33160 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
33170 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
33180 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
33190 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
331a0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
331b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
331c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
331d0 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
331e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
331f0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
33200 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
33210 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
33220 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33230 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
33240 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
33250 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
33260 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
33270 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
33280 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
33290 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
332a0 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
332b0 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
332c0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
332d0 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
332e0 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
332f0 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
33300 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
33310 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
33320 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
33330 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
33340 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
33350 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
33360 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
33370 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
33380 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
33390 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
333a0 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
333b0 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
333c0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
333d0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
333e0 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
333f0 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
33400 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
33410 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
33420 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
33430 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
33440 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
33450 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
33460 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
33470 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
33480 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
33490 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
334a0 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
334b0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
334c0 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
334d0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
334e0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
334f0 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
33500 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
33510 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
33520 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
33530 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33540 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33550 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
33560 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
33570 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
33580 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
33590 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
335a0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
335b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
335c0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
335d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
335e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
335f0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
33600 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
33610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33620 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
33630 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
33640 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
33650 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
33660 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
33670 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
33680 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
33690 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
336a0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
336b0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
336c0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
336d0 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
336e0 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
336f0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
33700 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
33710 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
33720 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
33730 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
33740 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
33750 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
33760 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
33770 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
33780 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
33790 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
337a0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
337b0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
337c0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
337d0 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
337e0 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
337f0 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
33800 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
33810 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
33820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
33830 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
33840 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
33850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
33860 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
33870 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
33880 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33890 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
338a0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
338b0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
338c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
338d0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
338e0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
338f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
33900 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
33910 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
33920 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
33930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33940 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
33950 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
33960 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
33970 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
33980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
33990 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
339a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
339b0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
339c0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
339d0 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
339e0 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
339f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
33a00 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
33a10 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
33a20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
33a30 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
33a40 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
33a50 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
33a60 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
33a70 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
33a80 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
33a90 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
33aa0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
33ab0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
33ac0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
33ad0 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
33ae0 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
33af0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
33b00 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
33b10 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
33b20 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
33b30 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
33b40 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
33b50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
33b60 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
33b70 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
33b80 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
33b90 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
33ba0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
33bb0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33bc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
33bd0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
33be0 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
33bf0 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
33c00 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
33c10 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
33c20 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
33c30 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
33c40 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
33c50 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
33c60 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
33c70 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
33c80 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
33c90 74 28 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20  t( nData==0 );. 
33ca0 20 20 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f     assert( nZero
33cb0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65  ==0 );.  }.  nHe
33cc0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33cd0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
33ce0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
33cf0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
33d00 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69  n the payload si
33d10 7a 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ze */.  if( pPag
33d20 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
33d30 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
33d40 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
33d50 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
33d60 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73    }else{ .    as
33d70 73 65 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66  sert( nKey<=0x7f
33d80 66 66 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d  ffffff && pKey!=
33d90 30 20 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  0 );.    nPayloa
33da0 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
33db0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
33dc0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
33dd0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
33de0 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
33df0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
33e00 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
33e10 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
33e20 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
33e30 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
33e40 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
33e50 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
33e60 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
33e70 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
33e80 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
33e90 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
33ea0 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
33eb0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
33ec0 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
33ed0 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
33ee0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
33ef0 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
33f00 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33f10 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
33f20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33f30 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
33f40 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
33f50 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
33f60 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
33f70 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
33f80 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
33f90 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
33fa0 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
33fb0 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
33fc0 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
33fd0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
33fe0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
33ff0 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
34000 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
34010 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
34020 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
34030 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
34040 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
34050 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
34060 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
34070 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
34080 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
34090 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
340a0 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
340b0 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
340c0 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
340d0 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
340e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340f0 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
34100 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
34110 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
34120 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
34130 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
34140 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
34150 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
34160 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
34170 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
34180 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
34190 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
341a0 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
341b0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
341c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
341d0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
341e0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
341f0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
34200 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
34210 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
34220 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
34230 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
34240 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
34250 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
34260 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
34270 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
34280 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
34290 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69  nHeader==(int)(i
342a0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
342b0 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
342c0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
342d0 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
342e0 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
342f0 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
34300 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
34310 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
34320 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
34330 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
34340 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
34350 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
34360 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
34370 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
34380 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
34390 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
343a0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
343b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
343c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
343d0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
343e0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
343f0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
34400 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34410 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
34420 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34430 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
34440 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
34450 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
34460 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
34470 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
34480 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
34490 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
344a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
344b0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
344c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
344d0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
344e0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
344f0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
34500 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
34510 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
34520 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
34530 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
34540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
34550 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34560 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
34570 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
34580 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
34590 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
345a0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
345b0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
345c0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
345d0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
345e0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
345f0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
34600 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
34610 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
34620 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
34630 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
34640 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
34650 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
34660 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
34670 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
34680 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
34690 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
346a0 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
346b0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
346c0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
346d0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
346e0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
346f0 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61  ialized values a
34700 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
34710 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
34720 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
34730 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
34740 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
34750 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
34760 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34770 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
34780 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
34790 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
347a0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
347b0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
347c0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
347d0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
347e0 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
347f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
34800 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34810 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
34820 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
34830 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
34840 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
34850 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
34860 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
34870 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
34880 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
34890 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
348a0 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
348b0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
348c0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
348d0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
348e0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
348f0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
34900 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
34910 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
34920 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
34930 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34940 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
34950 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34960 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
34970 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
34980 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
34990 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
349a0 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
349b0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
349c0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
349d0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
349e0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
349f0 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
34a00 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34a10 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34a30 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34a40 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34a50 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34a60 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
34a70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34a80 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
34a90 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
34aa0 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
34ab0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
34ac0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
34ad0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
34ae0 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
34af0 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
34b00 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
34b10 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
34b20 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
34b30 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
34b40 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
34b50 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
34b60 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
34b70 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
34b80 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
34b90 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
34ba0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
34bb0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
34bc0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
34bd0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
34be0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
34bf0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
34c00 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
34c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34c20 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
34c30 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
34c40 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
34c50 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
34c60 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
34c70 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
34c80 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
34c90 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
34ca0 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
34cb0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
34cc0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
34cd0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
34ce0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
34cf0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
34d00 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
34d10 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34d20 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34d30 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
34d40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
34d50 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
34d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
34d70 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
34d80 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
34d90 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
34da0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
34db0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
34dc0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
34dd0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
34de0 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
34df0 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
34e00 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
34e10 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
34e20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
34e30 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
34e40 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
34e50 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
34e60 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
34e70 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
34e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
34ea0 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
34eb0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
34ec0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
34ed0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
34ee0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
34ef0 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
34f00 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
34f10 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
34f20 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
34f30 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
34f40 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
34f50 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
34f60 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
34f70 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
34f80 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
34f90 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
34fa0 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
34fb0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
34fc0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
34fd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
34fe0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
34ff0 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
35000 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
35010 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
35020 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
35030 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
35040 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
35050 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
35060 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
35070 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
35080 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
35090 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
350a0 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
350b0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
350c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
350d0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
350e0 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
350f0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
35100 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
35110 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
35120 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
35130 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
35140 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
35150 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
35160 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
35170 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
35180 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c  T_DB || sz==cell
35190 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
351a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
351b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
351c0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
351d0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
351e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
351f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
35200 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
35210 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
35220 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67  a;.  ptr = &pPag
35230 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64  e->aCellIdx[2*id
35240 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
35250 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20  yte(ptr);.  hdr 
35260 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
35270 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  et;.  testcase( 
35280 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  pc==get2byte(&da
35290 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20  ta[hdr+5]) );.  
352a0 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
352b0 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
352c0 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28  bleSize );.  if(
352d0 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62   pc < (u32)get2b
352e0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
352f0 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61  ) || pc+sz > pPa
35300 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35310 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
35320 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
35330 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
35340 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
35350 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
35360 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
35370 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
35380 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
35390 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
353a0 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  l--;.  if( pPage
353b0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
353c0 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
353d0 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
353e0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
353f0 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  0;.    put2byte(
35400 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50  &data[hdr+5], pP
35410 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
35420 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
35430 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
35440 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35450 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   - pPage->hdrOff
35460 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
35470 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61             - pPa
35480 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
35490 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 8;.  }else{. 
354a0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20     memmove(ptr, 
354b0 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
354c0 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
354d0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
354e0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
354f0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  ->nCell);.    pP
35500 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
35510 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
35520 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
35530 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
35540 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
35550 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
35560 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
35570 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
35580 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
35590 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
355a0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
355b0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
355c0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
355d0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
355e0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
355f0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
35600 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
35610 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
35620 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
35630 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
35640 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
35650 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
35660 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
35670 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
35680 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
35690 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
356a0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
356b0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
356c0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
356d0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
356e0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
356f0 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
35700 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
35710 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
35720 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  emented..*/.stat
35730 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65  ic void insertCe
35740 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
35750 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20  Page,   /* Page 
35760 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72  into which we ar
35770 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69  e copying */.  i
35780 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20  nt i,           
35790 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63   /* New cell bec
357a0 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65  omes the i-th ce
357b0 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ll of the page *
357c0 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
357d0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
357e0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c   of the new cell
357f0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20   */.  int sz,   
35800 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
35810 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70   of content in p
35820 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54  Cell */.  u8 *pT
35830 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
35840 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63  emp storage spac
35850 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20  e for pCell, if 
35860 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f  needed */.  Pgno
35870 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a   iChild,      /*
35880 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65   If non-zero, re
35890 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79  place first 4 by
358a0 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61  tes with this va
358b0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  lue */.  int *pR
358c0 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  C          /* Re
358d0 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74  ad and write ret
358e0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65  urn code from he
358f0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
35900 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  dx = 0;      /* 
35910 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e  Where to write n
35920 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  ew cell content 
35930 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
35940 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  nt j;           
35950 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
35960 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
35970 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
35980 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
35990 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
359a0 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20 20   *pIns;         
359b0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e 20  /* The point in 
359c0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
359d0 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20  ] where no cell 
359e0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69  inserted */..  i
359f0 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
35a00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ;..  assert( i>=
35a10 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
35a20 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
35a30 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
35a40 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
35a50 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
35a60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35a70 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
35a80 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
35a90 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
35aa0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35ab0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
35ac0 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
35ad0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35ae0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
35af0 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
35b00 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
35b10 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
35b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35b30 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
35b40 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
35b50 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
35b60 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
35b70 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
35b80 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
35b90 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
35ba0 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
35bb0 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
35bc0 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
35bd0 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
35be0 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
35bf0 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
35c00 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
35c10 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
35c20 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
35c30 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
35c40 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
35c50 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
35c60 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
35c70 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
35c80 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
35c90 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
35ca0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
35cb0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70  .  assert( sz==p
35cc0 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
35cd0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
35ce0 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
35cf0 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
35d00 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
35d10 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
35d20 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
35d30 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
35d40 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
35d50 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
35d60 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
35d70 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
35d80 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
35d90 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
35da0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
35db0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
35dc0 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
35dd0 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
35de0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f  (pPage->apOvfl)/
35df0 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
35e00 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
35e10 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a   pPage->apOvfl[j
35e20 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  ] = pCell;.    p
35e30 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20  Page->aiOvfl[j] 
35e40 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f  = (u16)i;..    /
35e50 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
35e60 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c  overflows occur,
35e70 20 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73   they are always
35e80 20 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20   sequential and 
35e90 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64  in.    ** sorted
35ea0 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e   order.  This in
35eb0 76 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62  variants arise b
35ec0 65 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20  ecause multiple 
35ed0 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20  overflows can.  
35ee0 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20    ** only occur 
35ef0 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64  when inserting d
35f00 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
35f10 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
35f20 65 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  e during.    ** 
35f30 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74  balancing, and t
35f40 68 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20  he dividers are 
35f50 61 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72  adjacent and sor
35f60 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
35f70 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
35f80 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35f90 31 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20  1]<(u16)i ); /* 
35fa0 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72  Overflows in sor
35fb0 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ted order */.   
35fc0 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c   assert( j==0 ||
35fd0 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66   i==pPage->aiOvf
35fe0 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a  l[j-1]+1 );   /*
35ff0 20 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73   Overflows are s
36000 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d  equential */.  }
36010 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
36020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36030 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
36040 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
36050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36060 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
36070 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
36080 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
36090 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
360a0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
360b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
360c0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
360d0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
360e0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
360f0 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d  lOffset]==pPage-
36100 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20  >aCellIdx );.   
36110 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
36120 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
36130 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
36140 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
36150 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
36160 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
36170 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
36180 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
36190 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73 0a  wing properties.
361a0 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
361b0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
361c0 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  y */.    assert(
361d0 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20   idx >= 0 );.   
361e0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
361f0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
36200 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  t+2*pPage->nCell
36210 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  +2 || CORRUPT_DB
36220 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36230 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
36240 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
36250 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
36260 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
36270 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
36280 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
36290 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
362a0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
362b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
362c0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
362d0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
362e0 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e 61 43 65  Ins = pPage->aCe
362f0 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20  llIdx + i*2;.   
36300 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c   memmove(pIns+2,
36310 20 70 49 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d   pIns, 2*(pPage-
36320 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20  >nCell - i));.  
36330 20 20 70 75 74 32 62 79 74 65 28 70 49 6e 73 2c    put2byte(pIns,
36340 20 69 64 78 29 3b 0a 20 20 20 20 70 50 61 67 65   idx);.    pPage
36350 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f  ->nCell++;.    /
36360 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * increment the 
36370 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  cell count */.  
36380 20 20 69 66 28 20 28 2b 2b 64 61 74 61 5b 70 50    if( (++data[pP
36390 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34  age->hdrOffset+4
363a0 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b 70 50 61  ])==0 ) data[pPa
363b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
363c0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
363d0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
363e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
363f0 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  3])==pPage->nCel
36400 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  l );.#ifndef SQL
36410 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
36420 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
36430 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
36440 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
36450 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
36460 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
36470 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
36480 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
36490 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
364a0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
364b0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
364c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
364d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
364e0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
364f0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
36500 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
36510 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43    }.}../*.** A C
36520 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65 63 74 20  ellArray object 
36530 63 6f 6e 74 61 69 6e 73 20 61 20 63 61 63 68 65  contains a cache
36540 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 61 6e 64   of pointers and
36550 20 73 69 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20   sizes for a.** 
36560 63 6f 6e 73 65 63 75 74 69 76 65 20 73 65 71 75  consecutive sequ
36570 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73 20 74 68  ence of cells th
36580 61 74 20 6d 69 67 68 74 20 62 65 20 68 65 6c 64  at might be held
36590 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
365a0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
365b0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
365c0 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
365d0 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
365e0 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
365f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36600 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
36610 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
36620 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
36630 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
36640 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
36650 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36660 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
36670 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
36680 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
36690 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
366a0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
366b0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
366c0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
366d0 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
366e0 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
366f0 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
36700 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
36710 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
36720 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
36730 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
36740 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
36750 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36760 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36770 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
36780 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
36790 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
367a0 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
367b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
367c0 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
367d0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
367e0 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
367f0 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
36800 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
36810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36820 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
36830 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
36840 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
36850 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
36860 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
36870 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
36880 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ]) );.    }.    
36890 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a  idx++;.    N--;.
368a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
368b0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
368c0 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20  the Nth element 
368d0 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61  of the cell arra
368e0 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  y.*/.static SQLI
368f0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20  TE_NOINLINE u16 
36900 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
36910 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
36920 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36930 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
36940 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36950 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20  p->szCell[N]==0 
36960 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  );.  p->szCell[N
36970 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
36980 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36990 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20  p->apCell[N]);. 
369a0 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
369b0 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  l[N];.}.static u
369c0 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  16 cachedCellSiz
369d0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
369e0 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
369f0 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
36a00 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d  Cell );.  if( p-
36a10 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74  >szCell[N] ) ret
36a20 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36a30 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75  ;.  return compu
36a40 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29  teCellSize(p, N)
36a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36a60 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36a70 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
36a80 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
36a90 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
36aa0 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
36ab0 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
36ac0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
36ad0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
36ae0 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
36af0 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
36b00 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
36b10 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
36b20 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
36b30 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
36b40 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
36b50 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
36b60 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
36b70 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
36b80 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
36b90 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
36ba0 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
36bb0 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
36bc0 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
36bd0 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
36be0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
36bf0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
36c00 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
36c10 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
36c20 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
36c30 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
36c40 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
36c50 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
36c60 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
36c70 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
36c80 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69  static int rebui
36c90 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  ldPage(.  MemPag
36ca0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
36cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
36cc0 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
36cd0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cf0 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
36d00 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
36d10 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36d20 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36d30 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
36d40 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
36d50 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d70 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
36d80 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  izes */.){.  con
36d90 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
36da0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
36db0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
36dc0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67  of header on pPg
36dd0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
36de0 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
36df0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
36e00 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
36e10 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63  a for pPg */.  c
36e20 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53  onst int usableS
36e30 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
36e40 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38  usableSize;.  u8
36e50 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
36e60 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a  &aData[usableSiz
36e70 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  e];.  int i;.  u
36e80 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50  8 *pCellptr = pP
36e90 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75  g->aCellIdx;.  u
36ea0 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
36eb0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
36ec0 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
36ed0 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  );.  u8 *pData;.
36ee0 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28  .  i = get2byte(
36ef0 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  &aData[hdr+5]);.
36f00 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69    memcpy(&pTmp[i
36f10 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73  ], &aData[i], us
36f20 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a  ableSize - i);..
36f30 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a    pData = pEnd;.
36f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
36f50 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
36f60 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
36f70 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
36f80 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
36f90 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a  ,aData,pEnd) ){.
36fa0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
36fb0 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
36fc0 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
36fd0 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
36fe0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
36ff0 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
37000 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37010 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37020 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43    if( pData < pC
37030 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20  ellptr ) return 
37040 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37050 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
37060 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a  pData, pCell, sz
37070 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73  Cell[i]);.    as
37080 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d  sert( szCell[i]=
37090 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
370a0 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43  pPg, pCell) || C
370b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
370c0 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c   testcase( szCel
370d0 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]!=pPg->xCell
370e0 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20  Size(pPg,pCell) 
370f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
37100 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
37110 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
37120 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
37130 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
37140 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
37150 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
37160 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37170 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
37180 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
37190 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
371a0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
371b0 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
371c0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
371d0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
371e0 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
371f0 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e  = 0x00;.  return
37200 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37210 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37220 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37230 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37240 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37250 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e  ay szCell.** con
37260 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37270 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
37280 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
37290 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
372a0 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65  s to .** add the
372b0 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e   cells stored in
372c0 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61   the array to pa
372d0 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61  ge pPg. If it ca
372e0 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a  nnot (because .*
372f0 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  * the page needs
37300 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e   to be defragmen
37310 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ted before the c
37320 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20  ells will fit), 
37330 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  non-zero.** is r
37340 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
37350 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73  se, if the cells
37360 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65   are added succe
37370 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ssfully, zero is
37380 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
37390 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65  .** Argument pCe
373a0 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20  llptr points to 
373b0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
373c0 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
373d0 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61  ter array.** (pa
373e0 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20  rt of page pPg) 
373f0 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74  to populate. Aft
37400 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30  er cell apCell[0
37410 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ] is written to 
37420 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79  the.** page body
37430 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65  , a 16-bit offse
37440 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
37450 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f  pCellptr. And so
37460 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a   on, for each.**
37470 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
37480 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ay. It is the re
37490 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
374a0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
374b0 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20  sure.** that it 
374c0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77  is safe to overw
374d0 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f  rite this part o
374e0 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  f the cell-point
374f0 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  er array..**.** 
37500 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
37510 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
37520 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  pData points to 
37530 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37540 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65   .** content are
37550 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49  a on page pPg. I
37560 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
37570 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  e content area i
37580 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a  s extended,.** *
37590 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65  ppData is update
375a0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
375b0 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74  e new start of t
375c0 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  he content area.
375d0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
375e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ing..**.** Final
375f0 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65  ly, argument pBe
37600 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  gin points to th
37610 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
37620 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
37630 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73  .** end of the s
37640 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79  pace required by
37650 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74   this page for t
37660 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37670 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c  area (for.** all
37680 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73   cells - not jus
37690 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64  t those inserted
376a0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
376b0 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f  call). If the co
376c0 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75  ntent.** area mu
376d0 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  st be extended t
376e0 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f  o before this po
376f0 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
37700 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a  accomodate all.*
37710 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  * cells in apCel
37720 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65  l[], then the ce
37730 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61  lls do not fit a
37740 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  nd non-zero is r
37750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
37760 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72  ic int pageInser
37770 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  tArray(.  MemPag
37780 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
37790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
377a0 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74  e to add cells t
377b0 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69  o */.  u8 *pBegi
377c0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
377d0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
377e0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
377f0 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ray */.  u8 **pp
37800 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
37810 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
37820 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74  UT: Page content
37830 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a   -area pointer *
37840 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
37850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37860 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
37870 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  o cell-pointer a
37880 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rea */.  int iFi
37890 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
378a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
378b0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
378c0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
378d0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
378e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
378f0 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
37900 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a  o add to pPg */.
37910 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
37920 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37930 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37940 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
37950 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
37960 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37970 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
37980 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  ta;.  int iEnd =
37990 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b   iFirst + nCell;
379a0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
379b0 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64  PT_DB || pPg->hd
379c0 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  rOffset==0 );   
379d0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
379e0 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   on page 1 */.  
379f0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
37a00 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
37a10 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20  int sz, rc;.    
37a20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73  u8 *pSlot;.    s
37a30 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69  z = cachedCellSi
37a40 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a  ze(pCArray, i);.
37a50 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31      if( (aData[1
37a60 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d  ]==0 && aData[2]
37a70 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  ==0) || (pSlot =
37a80 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
37a90 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b  g,sz,&rc))==0 ){
37aa0 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d 20  .      pData -= 
37ab0 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  sz;.      if( pD
37ac0 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65 74  ata<pBegin ) ret
37ad0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53 6c  urn 1;.      pSl
37ae0 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  ot = pData;.    
37af0 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20 61  }.    /* pSlot a
37b00 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65  nd pCArray->apCe
37b10 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65 72  ll[i] will never
37b20 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77 65   overlap on a we
37b30 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a 2a  ll-formed.    **
37b40 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
37b50 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20 61  they might for a
37b60 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
37b70 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d 65  e.  Hence use me
37b80 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20 73  mmove().    ** s
37b90 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73 65  ince memcpy() se
37ba0 6e 64 73 20 53 49 47 41 42 4f 52 54 20 77 69 74  nds SIGABORT wit
37bb0 68 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62 75  h overlapping bu
37bc0 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53 44  ffers on OpenBSD
37bd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37be0 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41 72  (pSlot+sz)<=pCAr
37bf0 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20  ray->apCell[i]. 
37c00 20 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f 74          || pSlot
37c10 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43 65  >=(pCArray->apCe
37c20 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20 20  ll[i]+sz).      
37c30 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
37c40 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28   );.    memmove(
37c50 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d 3e  pSlot, pCArray->
37c60 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
37c70 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
37c80 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20  llptr, (pSlot - 
37c90 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
37ca0 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a  llptr += 2;.  }.
37cb0 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61 74    *ppData = pDat
37cc0 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  a;.  return 0;.}
37cd0 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
37ce0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
37cf0 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74  nCell pointers t
37d00 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20  o b-tree cells. 
37d10 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a  Array szCell .**
37d20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69   contains the si
37d30 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65  ze in bytes of e
37d40 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54  ach such cell. T
37d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 64  his function add
37d60 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61  s the.** space a
37d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
37d80 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65 20  ach cell in the 
37d90 61 72 72 61 79 20 74 68 61 74 20 69 73 20 63 75  array that is cu
37da0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a  rrently stored .
37db0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f  ** within the bo
37dc0 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68 65  dy of pPg to the
37dd0 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e 20   pPg free-list. 
37de0 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  The cell-pointer
37df0 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66  s and other.** f
37e00 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61 67  ields of the pag
37e10 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74 65  e are not update
37e20 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
37e30 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
37e40 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
37e50 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20 74  of cells added t
37e60 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  o the free-list.
37e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37e80 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
37e90 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20  MemPage *pPg,   
37ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37eb0 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74 20  /* Page to edit 
37ec0 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ee0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 65       /* First ce
37ef0 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ll to delete */.
37f00 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
37f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65    /* Cells to de
37f30 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72  lete */.  CellAr
37f40 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20  ray *pCArray    
37f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37f60 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29  ay of cells */.)
37f70 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61  {.  u8 * const a
37f80 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74  Data = pPg->aDat
37f90 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  a;.  u8 * const 
37fa0 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70 50  pEnd = &aData[pP
37fb0 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
37fc0 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ze];.  u8 * cons
37fd0 74 20 70 53 74 61 72 74 20 3d 20 26 61 44 61 74  t pStart = &aDat
37fe0 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  a[pPg->hdrOffset
37ff0 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69 6c   + 8 + pPg->chil
38000 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  dPtrSize];.  int
38010 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74   nRet = 0;.  int
38020 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d   i;.  int iEnd =
38030 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b   iFirst + nCell;
38040 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
38050 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d  ;.  int szFree =
38060 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46 69   0;..  for(i=iFi
38070 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b  rst; i<iEnd; i++
38080 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
38090 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65   = pCArray->apCe
380a0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53  ll[i];.    if( S
380b0 51 4c 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65  QLITE_WITHIN(pCe
380c0 6c 6c 2c 20 70 53 74 61 72 74 2c 20 70 45 6e 64  ll, pStart, pEnd
380d0 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  ) ){.      int s
380e0 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e  z;.      /* No n
380f0 65 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65  eed to use cache
38100 64 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65  dCellSize() here
38110 2e 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20  .  The sizes of 
38120 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20  all cells that. 
38130 20 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62       ** are to b
38140 65 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72  e freed have alr
38150 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74  eady been comput
38160 69 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69  ing while decidi
38170 6e 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  ng which.      *
38180 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65  * cells need fre
38190 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a  eing */.      sz
381a0 20 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65   = pCArray->szCe
381b0 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20  ll[i];  assert( 
381c0 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66  sz>0 );.      if
381d0 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20  ( pFree!=(pCell 
381e0 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  + sz) ){.       
381f0 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
38200 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
38210 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
38220 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
38230 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20  5536 );.        
38240 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c    freeSpace(pPg,
38250 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61   (u16)(pFree - a
38260 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a  Data), szFree);.
38270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38280 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b    pFree = pCell;
38290 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20  .        szFree 
382a0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66  = sz;.        if
382b0 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20  ( pFree+sz>pEnd 
382c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
382d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
382e0 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
382f0 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b          szFree +
38300 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = sz;.      }.  
38310 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20      nRet++;.    
38320 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65  }.  }.  if( pFre
38330 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
38340 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20   pFree>aData && 
38350 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c  (pFree - aData)<
38360 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65  65536 );.    fre
38370 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36  eSpace(pPg, (u16
38380 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29  )(pFree - aData)
38390 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20  , szFree);.  }. 
383a0 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
383b0 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  ./*.** apCell[] 
383c0 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e  and szCell[] con
383d0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
383e0 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61  o and sizes of a
383f0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a  ll cells in the.
38400 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  ** pages being b
38410 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75  alanced.  The cu
38420 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c  rrent page, pPg,
38430 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20   has pPg->nCell 
38440 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a  cells starting.*
38450 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f  * with